8

我读到 int 的范围取决于一个字节。

因此,将 int 设为 4 个字节长,即 4 * 8 位 = 32 位。

所以范围应该是:2 ^ (32-1) = 2 ^ (31)

为什么有些人说它是 2^31 - 1 呢?

谢谢!

4

5 回答 5

7

因为计数从0开始

int 的范围是2,147,483,6472^32,即2,147,483,648。因此我们减去1

1位的丢失也是正负号

检查有关整数的这个interestinf wiki文章:-

正整数最常见的表示是一串位,使用二进制数字系统。存储位的内存字节顺序不同;见字节顺序。整数类型的宽度或精度是其表示形式的位数。n 位的整数类型可以编码 2n 个数字;例如,无符号类型通常表示非负值 0 到 2n-1。有时使用其他整数值到位模式的编码,例如二进制编码的十进制或格雷码,或作为印刷字符代码,如 ASCII。

在二进制计算系统中有四种众所周知的方式来表示有符号数。最常见的是二进制补码,它允许具有 n 位的有符号整数类型表示从 -2(n-1) 到 2(n-1)-1 的数字。二进制补码算法很方便,因为表示和值之间存在完美的一一对应关系(特别是没有单独的 +0 和 -0),并且因为加法、减法和乘法不需要区分有符号和无符号类型. 其他可能性包括偏移二进制、符号大小和一个的补码。

于 2013-10-12T11:21:11.930 回答
3

您的意思是 2 32 -1,而不是 2 32-1

但是您的问题是关于人们为什么使用 2 31。如果 int 是有符号的,则会丢失一整位。您丢失第一位以指示数字是正数还是负数。

有符号整数(32 位)的范围从 -2,147,483,648 到 +2,147,483,647。无符号整数(32 位)的范围从 0 到 4,294,967,295(即 2 32 -1)。

于 2013-10-12T11:23:58.993 回答
0

int 是有符号数据类型。第一位表示符号,后面是值的位。如果符号位为 0,则该值只是设置为 1 的所有位的总和(2 的幂)。

例如 0...00101 是 2 0 + 2 2 = 5

如果第一位为 1,则值为 -2 32 + 所有设置为 1 的位的总和(2 的幂)。

例如 1...111100 是 -2 32 + 2 31 + 2 30 + ... + 2 2 = -4

全 0 将导致零。

之后计算时,您会看到(包括)范围 - 2 31和 2 0 + ... + 2 31 = 2 32 - 1 之间的任何数字都可以用这 32 位创建。

于 2013-10-12T11:31:05.727 回答
0

由于整数是 32 位的。它可以存储总共 2^32 个值。所以一个整数范围从 -2^31 到 2^31-1,总共有 2^32 个值(负数范围内的 2^31 个值+正数范围内的 2^31 个值,包括 0)。但是,第一位(最高有效位)保留给整数的符号。您再次需要了解负整数的存储方式。它们以 2 的补码形式存储,因此 -9 将存储为 9 的 2 的补码。因此 9 在 32 位系统中存储为 0000 0000 0000 0000 0000 0000 0000 1001 和 - 9 将存储为 1111 1111 1111 1111 1111 1111 1111 0111(9 的 2 补码)。

再次由于对整数的一些算术运算,如果它恰好超过最大值(2^31-1),那么它将循环为负值。所以如果你把 1 加到 2^31-1 上,它会给你 -2^31。

于 2013-10-12T11:57:11.873 回答
0

2 32-1与 2 32 - 1 不同(因为 0 包含在范围内,我们减去 1)

为了您的理解,让我们用小数字 4 代替 32

2 4-1 = 8 而 2 4 -1 = 16-1 = 15。

希望这可以帮助!

于 2013-10-12T11:24:57.803 回答