32位单元C编程语言的范围

Range of 32 bit unit C programming language

我目前正在按照书本学习 C 编程语言 "C primer plus"。

在溢出部分,作者指出

minimum range for long is –2,147,483,647 to 2,147,483,647, corresponding to a 32-bit unit.

我想知道,32 位单元的最大值不应该是 2,147,483,648 而不是作者所说的 2,147,483,647 吗?

我还看到 on tutorial point 32 位单元的范围是 –2,147,483,648 to 2,147,483,647。我非常困惑。


此外,当我 运行 代码

int i = 2147483647;
printf("%d %d %d\n", i, i+1, i+2);

得到结果2147483647 -2147483648 -2147483647,支持32位单位的取值范围是–2,147,483,648 to 2,147,483,647。那么哪个是正确的呢?

PS - 我以前研究过二进制补码系统,据我所知,最大数应该始终是 -(min number) + 1,所以从二进制补码系统,我在想–2,147,483,647 to 2,147,483,648 更有可能是正确的。但是上面的printf好像是支持–2,147,483,648 to 2,147,483,647的,和作者说的–2,147,483,647 to 2,147,483,647不一样。

32位内存可以编码,最多,232个不同的值。

C 整数由 3 部分组成:符号位、值位和很少的填充位。对于这个答案,假设填充位数为零。

C 支持 3 种整数编码:2 的补码、1 的补码、符号大小。

一个 32 位整数则具有

的范围
  1. 2 的补码:[–2,147,483,648 ... 2,147,483,647] 目前最常见
  2. 1 的补码:[–2,147,483,647 ... 2,147,483,647] 1 比 2 小范围
  3. 符号幅度:[–2,147,483,647 ... 2,147,483,647] 比 2 小 1 的范围

然后所有 3 个都满足 long:

的 C 要求

Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.
- minimum value for an object of type long int LONG_MIN -2147483647
- maximum value for an object of type long int LONG_MAX +2147483647 C11dr §5.2.4.2.1 1

请注意,longint 可能是 64 位的,并且范围更广。


I was wondering, shouldn't the max value for a 32 bit unit be 2,147,483,648

2,147,483,648 与 32 位 2's complement 不兼容,因为它需要 33 位。


避免 C 中的整数溢出,因为它是未定义的行为 (UB)。 OP 的文本输出不确定。

int i = 2147483647;   // v----v----- UB
printf("%d %d %d\n", i, i+1, i+2);

而是根据 <limits.h> 打印 min/max:

printf("int  min:%d max:%d\n", INT_MIN, INT_MAX);
printf("long min:%ld max:%ld\n", LONG_MIN, LONG_MAX);

即使 OP 的最小整数是 –2,147,483,648,这并不意味着它是所有实现的最小值。 C 规范只需要 –2,147,483,647 或更少。

–2,147,483,648 到 2,147,483,647 加零。简而言之,你忘了数零。