n
位整数的最大值为 2 n -1。为什么我们有“负1”?为什么最大值不只是 2 n?
12 回答
这-1
是因为整数从 0 开始,但我们的计数从 1 开始。
因此,2^32-1
是32 位无符号整数(32 个二进制数字)的最大值。2^32
是可能值的数量。
为了简化原因,看看十进制。10^2-1
是 2 位十进制数 (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
这里看似“不合一”错误的原因是最低位表示一,而不是二。所以第一位实际上是2^0
,第二位是2^1
,等等......
二进制中的2 32是 1 后跟 32 个零,总共33位。这不适合 32 位 int 值。
在大多数编程语言中,也是0
一个数字。
从 0 到 N 的数字不是 N。它们是 N+1。这对大多数人来说并不明显,因此许多程序都有错误,因为如果这个原因。
因为0也被表示。你可以表示的数字的数量确实是 2^n 用 n 位,但是最大的数字是 2^n-1 因为你必须从 0 开始计数,即每个位都设置为 0。
1 位:0、1
2 位:0、1、2、3
3 位:0、1、2、3、4、5、6、7
等等。
这是因为在计算中,数字从0
. 因此,例如,如果您有 32 个地址行(2 32 个可寻址字节),它们将在范围内[0, 2^32)
。
如果你刚开始编程,我建议你看看这篇关于有符号数表示的 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。因此,您可以将其扩展到 anyn
并说您可以表示 range 中的整数[0,2^n -1]
。现在您可以阅读那篇文章并了解不同的形式,以及表示负整数等。
如果我问你可以放入一个 2 位数字的最大值是多少,你会说它是 10 2 (100) 还是 10 2 -1 (99)?显然是后者。因此,如果我问你最大的n
数字是多少,那将是 10 n -1。但是为什么会有“-1”呢?很简单,因为我们可以将 0 在 2 位数字中也表示为 00(但每个人都只写 0)。
让我们10
用任意基数替换,b
. 因此,对于给定的基数 ,您可以表示b
的最大n
位数是 b n -1。使用 32 位 ( n = 32
) base-2 ( b = 2
) 数,我们看到我们可以表示的最大值是 2 32 -1。
另一种思考方式是使用较小的数字。假设我们有一个 1 位数字。你能告诉我它可以代表的最大值是 2 1还是 2 1 -1?
为什么我们有“负1”?
只需回答问题:1 位整数的最大值是多少?
一位整数只能存储两个(2 1 ) 值:0
和1
。最后一个值为 1 2 = 1 10
两位整数只能存储四个(2 2 ) 值:00
、01
和10
。11
最后一个值为 11 2 = 3 10
因此,当整数可以存储时N
,值最后一个值将是N-1
因为计数从零开始。
n
位整数可以存储2
n
值。最后一个在哪里2
-1
示例:一个字节可以存储2
8 (256) 个值。0
第一个和最后一个在哪里255
为什么最大值不只是2n?
因为计数从零开始。查看任何n
位整数的第一个值。
例如字节:00000000
如果:
00000001
意味着2
00000000
意味着1
不会?;-)
在大多数编程语言中,整数是有符号值(参见二进制补码)。
例如,在 Java 和 .NET 整数中,最左边的字节保留用于符号:
0
=> 正数或零数1
=> 负数
那么 number 的最大值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)
在计算领域,我们从 0 开始计数。