35

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

4

12 回答 12

73

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

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

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

于 2011-04-24T15:54:29.583 回答
28

2^32二进制:

1 00000000 00000000 00000000 00000000

2^32 - 1二进制:

11111111 11111111 11111111 11111111

如您所见,2^3233位,而是位整数2^32 - 1的最大值。32

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

于 2011-04-24T16:18:03.583 回答
14

二进制中的2 32是 1 后跟 32 个零,总共33位。这不适合 32 位 int 值。

于 2011-04-24T15:54:46.817 回答
13

在大多数编程语言中,也是0一个数字。

于 2011-04-24T15:51:50.377 回答
6

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

于 2011-04-24T15:54:30.860 回答
4

因为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

等等。

于 2014-12-12T15:33:33.827 回答
4

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

于 2011-04-24T15:52:24.527 回答
4

如果你刚开始编程,我建议你看看这篇关于有符号数表示的 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]。现在您可以阅读那篇文章并了解不同的形式,以及表示负整数等。

于 2011-04-24T15:59:07.273 回答
3

如果我问你可以放入一个 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?

于 2014-05-25T03:30:13.283 回答
3

为什么我们有“负1”?

只需回答问题:1 位整数的最大值是多少?

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

两位整数只能存储四个(2 2 ) 值:00011011最后一个值为 11 2 = 3 10

因此,当整数可以存储时N,值最后一个值将是N-1因为计数从零开始

n位整数可以存储2n值。最后一个在哪里2-1

示例:一个字节可以存储28 (256) 个值。0第一个和最后一个在哪里255

为什么最大值不只是2n?

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

如果:
00000001意味着2
00000000意味着1

不会?;-)

于 2018-04-27T17:12:55.740 回答
2

在大多数编程语言中,整数是有符号值(参见二进制补码)。

例如,在 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,而不是。20/1

Int32.MaxValue = 2147483647 (.NET)
于 2014-03-07T18:36:36.620 回答
0

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

于 2011-04-24T16:09:00.597 回答