为什么无符号n位整数的最大值为2 ^ n-1而不是2 ^ n?

时间:2011-04-24 15:50:22

标签: integer programming-languages numeric-limits

n - 位整数的最大值是2 n -1。为什么我们有“减1”?为什么最大只有2 n

12 个答案:

答案 0 :(得分:66)

-1是因为整数从0开始,但我们的计数从1开始。

因此,2^32-1是32位无符号整数(32位二进制数字)的最大值2^32可能值的数量

为了简化原因,请查看十进制。 10^2-1是2位十进制数(99)的最大值。因为我们直观的人类计数从1开始,但整数从0开始,10^2是值的数量(100)。

答案 1 :(得分:24)

二进制文件中的

2^32

1 00000000 00000000 00000000 00000000
二进制文件中的

2^32 - 1

11111111 11111111 11111111 11111111

如您所见,2^32占用33位,而2^32 - 132位整数的最大值。

这里看似“一个一个”错误的原因是最低位代表一个而不是两个。所以 第一个 位实际上是2^0 第二个 位是2^1,等...

答案 2 :(得分:12)

二进制中的

2 32 是一个后跟32个零,总共 33 位。这不适合32位的int值。

答案 3 :(得分:8)

在大多数编程语言中,0也是的数字

答案 4 :(得分:5)

从0到N的数字不是N.它们是N + 1。这对大多数人来说并不明显,因此许多程序都有错误,因为如果这个原因。

答案 5 :(得分:2)

这是因为在计算中,数字从0开始。因此,如果您有32个地址线(2 32 可寻址字节),它们将在[0, 2^32)范围内。

答案 6 :(得分:2)

如果您刚刚开始编程,我建议您查看signed number representations

上的这篇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]范围内表达整数。现在你可以阅读那篇文章并理解不同的形式,并表示负整数等。

答案 7 :(得分:2)

如果我问你最适合2位数的值是多少,你会说它是10 2 (100)或10 2 -1 (99)?显然是后者。因此,如果我问你最大的n - 位数是多少,那么它将是10 n -1。但为什么会出现“-1”?很简单,因为我们可以将2位数字中的0表示为00(但每个人只写0)。

让我们用任意基数10替换b。因此,对于给定的基数b,您可以表示的最大n - 位数是b n -1。使用32位(n = 32)base-2(b = 2)数字,我们看到最大值我们可以表示2 32 -1。


另一种思考方式是使用较小的数字。假设我们有一位数。你能告诉我它能代表的最大值是2 1 还是2 1 -1?

答案 8 :(得分:1)

在大多数编程语言中, integer是有符号值(参见two's complement)。

例如,在Java和.NET中,大多数左边的字节都是为sign:

保留的
  • 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)

答案 9 :(得分: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

等等。

答案 10 :(得分:0)

在计算领域,我们从0开始计算。

答案 11 :(得分:0)

  

为什么我们有“减1”?

回答这个问题:什么是 1位整数的最大值

一位整数只能存储两个(2 1 )值:01。最后一个值是1 2 = 1 10

两位整数只能存储(2 2 )值:0001,{ {1}}和10。最后一个值是11 2 = 3 10

因此,当整数可以存储11时,值的最后一个值将为N,因为计数从开始。

N-1位整数可以存储n 2 值。最后一位是n n 2

实施例: 一个字节可以存储-1 8 (256)值。首先是2,最后是0

  

为什么最大值不是2n?

因为计数从零开始。查看任何255位整数的第一个值 例如字节:n

如果出现以下情况,这将非常令人困惑:
00000000表示00000001
2表示00000000

不会吗? ; - )