web-dev-qa-db-ja.com

符号なしnビット整数の最大値が2 ^ nではなく2 ^ n-1になるのはなぜですか?

n- bit整数の最大値は2です-1。なぜ「マイナス1」があるのですか?なぜ最大値が2でないのですか

27
Ugdu Shan

-1は、整数は0から始まりますが、カウントは1から始まるためです。

そう、 2^32-1は、32ビットの符号なし整数(32桁の2進数)の最大値です。 2^32可能な値の数です。

理由を簡単にするために、10進数を見てください。 10^2-1は2桁の10進数の最大値(99)です。私たちの直感的な人間のカウントは1から始まりますが、整数は0ベースなので、10^2は値の数(100)です。

66
tenfour

バイナリの2^32

1 00000000 00000000 00000000 00000000

バイナリの2^32 - 1

11111111 11111111 11111111 11111111

ご覧のとおり、2^3233ビットを使用しますが、2^32 - 132ビット整数の最大値です。

ここで「オフバイワン」のように見えるエラーの理由は、最下位ビットが2ではなく1を表すためです。したがって、firstビットは実際には2^0secondですビットは2^1などです...

25
Mark Kahn

232 バイナリでは、1つの後に32個のゼロが続き、合計でビットになります。これは、32ビットのint値には適合しません。

12
Ted Hopp

ほとんどのプログラミング言語では、0は数値tooです。

8
Vicente Plata

0からNまでの数字はNではありません。N+ 1です。これは大多数の人々には明らかではなく、その結果、多くのプログラムにはバグがあります。

5

コンピューティングでは、数値は0から始まるためです。たとえば、32行の住所行がある場合(232 アドレス可能なバイト)、[0, 2^32)の範囲になります。

2
Yuval Adam

プログラミングを始めたばかりの場合は、このwikiの記事 符号付き数値表現 をご覧になることをお勧めします。

Vicenteが述べたように、1を減算する理由は、0も含まれる数値だからです。簡単な例として、3ビットで、次の負でない整数を表すことができます

0 : 000
1 : 001
2 : 010
3 : 011
4 : 100
5 : 101
6 : 110
7 : 111

それを超えるものは、3桁以上が必要です。したがって、表現できる最大数は2 ^ 3-1 = 7です。したがって、これを任意のnに拡張して、[0,2^n -1]の範囲の整数を表現できると言えます。これで、その記事を読んでさまざまな形式を理解し、負の整数を表すことができます。

2
abcd

2桁の数値に当てはまる最大の値は何ですかと尋ねると、10だと思いますか2 (100)または102-1(99)?明らかに後者です。したがって、nの最大の桁数を尋ねると、10になります。-1。しかし、なぜ「-1」があるのでしょうか。簡単に言うと、2桁の数値で0を00として表すこともできるからです(ただし、誰もが0と書くだけです)。

10を任意のベースbに置き換えましょう。したがって、与えられた基数bに対して、表現できる最大のn桁の数値はb-1。 32ビット(n = 32)の基数2(b = 2)の数値を使用すると、2を表すことができる最大値がわかります。32-1。


それについて考えるもう1つの方法は、小さい数値を使用することです。 1ビットの数値があるとします。それが表すことができる最大の値は2だと教えていただけますか1 または21-1?

2
Cole Johnson

ほとんどのプログラミング言語では整数は符号付きの値です2の補数 を参照)。

たとえば、Javaおよび.NET整数では、左端のバイトが符号用に予約されています。

  • 0 =>正またはゼロの数値
  • 1 =>負の数

次に、32-bitの最大値は2^31によって制限されます。そして-1を追加すると、2^31 - 1になります。

-1が表示されるのはなぜですか?

符号なしバイト(8ビット)を使用したより簡単な例を見てください。

  1  1  1  1  1  1  1  1
128 64 32 16  8  4  2  1  <-- the most right bit cannot represent 2
--- --------------------
128 + 127 = 255 

他の人が指摘したように、1の値により、最も正しいビットの最大値は2ではなく0/1になる可能性があります。

Int32.MaxValue = 2147483647 (.NET)
1
Artru

0も表されているためです。実際に表すことができる数値の量はnビットで2 ^ nですが、カウントは0から開始する必要があるため、つまりすべてのビットが0に設定されているため、最大数は2 ^ n-1です。

1ビットの場合:0、1
2ビットの場合:0、1、2、3
3ビットの場合:0、1、2、3、4、5、6、7

等々。

1
Mel

なぜ「マイナス1」があるのですか?

ちょうど質問に答えてください:1ビット整数の最大値は何ですか

1ビット整数はのみ保存できます2(21)値:0および1。最後の値は1です2 = 110

2ビット整数は4(22)値:000110および11。最後の値は11です2 = 10

したがって、整数がNを格納できる場合、カウントはzeroから始まるため、最後の値はN-1になります。

nビット整数は2を格納できますn 値。最後は2になります-1

例:1バイトで2を格納できます8 (256)値。最初は0、最後は255です。

最大値が2nでないのはなぜですか?

カウントはゼロから始まるからです。 nビット整数の最初の値を確認します。
バイトの例:00000000

次の場合、これは非常に混乱します。
000000012を意味します
000000001を意味します

しませんか? ;-)

0
Eugen Konkov

コンピューティングの分野では、0から数え始めます。

0
Eminem