n
ビット整数の最大値は 2 n -1 です。なぜ「マイナス1」があるのですか?最大値が 2 nではないのはなぜですか?
12 に答える
これ-1
は、整数は 0 から始まるためですが、カウントは 1 から始まります。
したがって、2^32-1
は32 ビットの符号なし整数 (2 進数で 32 桁)の最大値です。可能な値2^32
の数です。
理由を簡単にするために、10 進数を見てください。10^2-1
2 桁の 10 進数 (99) の最大値です。人間の直感的な数え方は 1 から始まりますが、整数は 0 ベースなので、10^2
値の数 (100) です。
2^32
バイナリで:
1 00000000 00000000 00000000 00000000
2^32 - 1
バイナリで:
11111111 11111111 11111111 11111111
ご覧のとおり、はビットを2^32
取り、 はビット整数の最大値です。33
2^32 - 1
32
ここで「1 つずつずれている」ように見えるエラーの理由は、最下位ビットが 2 ではなく 1 を表しているためです。したがって、最初のビットは実際2^0
には 、2 番目のビットは2^1
などです...
バイナリの2 32は、1 の後に 32 個のゼロが続き、合計33ビットになります。これは 32 ビットの int 値には収まりません。
ほとんどのプログラミング言語では、も0
数字です。
0 から N までの数字は N ではなく、N+1 です。これは大多数の人には明らかではなく、その結果、多くのプログラムにバグがあります。
プログラミングを始めたばかりの場合は、符号付き数値表現に関するこの wiki 記事をご覧になることをお勧めします。
ビセンテが述べたように、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]
。これで、その記事を読んで、さまざまな形式や負の整数の表現などを理解できます。
コンピューティングでは、数字は から始まるから0
です。たとえば、アドレス行が 32 行 (2 32アドレス指定可能バイト) ある場合、それらは[0, 2^32)
.
Why do we have the "minus 1"?
Just answer the question: What is the maximum value of an 1-bit integer?
One bit integer can store only two (21) values: 0
and 1
. Last value is 12 = 110
Two bit integer can store only four (22) values: 00
, 01
, 10
and 11
. Last value is 112 = 310
Thus, when integer can stores N
, values last value will be N-1
because counting starts from zero.
n
bit integer can store 2
n
values. Where last will be 2
n-1
Example:
One byte can store 2
8 (256) values. Where first is 0
and last is 255
Why isn't the maximum just 2n?
Because counting starts from zero. Look at first value for any n
bit integer.
For example byte: 00000000
This would be very confusing if:
00000001
means 2
00000000
means 1
would not? ;-)
2桁の数字に収まる最大の値は? 明らかに後者です。したがって、最大のn
桁数は何かと尋ねると、10 n -1 となります。しかし、なぜ「-1」があるのですか?簡単に言えば、2 桁の数字で 0 を 00 として表すこともできるからです (しかし、誰もが 0 と書くだけです)。
10
を任意の基数に置き換えてみましょうb
。与えられた基数 に対して、表現できるb
最大桁数は b n -1 です。32 ビット ( ) 基数 2 ( ) の数値を使用すると、表現できる最大値は 2 32 -1 であることがわかります。n
n = 32
b = 2
それについて考える別の方法は、より小さな数を使用することです。1 ビットの数値があるとします。それが表すことができる最大の値は 2 1または 2 1 -1 でしょうか?
ほとんどのプログラミング言語では、整数は符号付きの値です( 2 の補数を参照)。
たとえば、Java と .NET の整数では、左端のバイトは符号用に予約されています。
0
=> 正またはゼロの数値1
=> 負の数
この場合、 numberの最大値は 2 3132-bit
に制限されます。加えて 2 31 - 1 が得られます。-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)
コンピューティングの分野では、0から数え始めます。