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 位整数则具有
的范围
- 2 的补码:
[–2,147,483,648 ... 2,147,483,647]
目前最常见
- 1 的补码:
[–2,147,483,647 ... 2,147,483,647]
1 比 2 小范围
- 符号幅度:
[–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
请注意,long
和 int
可能是 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 加零。简而言之,你忘了数零。
我目前正在按照书本学习 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 位整数则具有
的范围- 2 的补码:
[–2,147,483,648 ... 2,147,483,647]
目前最常见 - 1 的补码:
[–2,147,483,647 ... 2,147,483,647]
1 比 2 小范围 - 符号幅度:
[–2,147,483,647 ... 2,147,483,647]
比 2 小 1 的范围
然后所有 3 个都满足 long
:
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 typelong int
LONG_MIN
-2147483647
- maximum value for an object of typelong int
LONG_MAX
+2147483647
C11dr §5.2.4.2.1 1
请注意,long
和 int
可能是 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 加零。简而言之,你忘了数零。