为什么我可以用 int > +32767 来操作?

Why can I operate with int > +32767?

我可以读出整数范围(有符号)来自 [−32767, +32767] 但我可以说,例如

int a=70000;
int b=71000;
int c=a+b;

printf("%i", c);
return 0;

输出为 141000(正确)。调试器不应该告诉我吗 "this operation is out of range" 或类似的东西?

我想这一定是因为我忽略了 C 编程的基础知识,但是我目前正在阅读的 none 书中没有提到这一点 "issue"。

编辑: 2147483647 好像是上限,谢谢。如果总和超过该数字,则结果为负,这是预期的,但如果它是减法,例如:2147483649-2147483647=2 结果仍然不错。我的意思是,为什么值 2147483649 正确地用于该减法目的(或者至少在我看来)?

在 C++ 中,int至少 16 位长,但在现代硬件上通常为 32 位。你可以写 INT_MININT_MAX 并检查你自己。

请注意,有符号整数溢出是未定义的行为,您不能保证会收到警告,除非可能出现高编译器警告和调试模式。

范围[−32767, +32767]是要求的最小范围。允许实现提供更大的范围。

所有类型都是compiler-dependent。 int 曾经是底层硬件的 "native word",在 16 位系统上意味着 int 是 16 位(这导致 -32k 到 +32k 范围)。当32位系统开始出现时,int自然而然地变成了32位,可以存储大约-20亿到+20亿的值。

然而,当 64 位系统出现时,"native word" 用于 int 并没有跟进,我知道没有 64 位系统或编译器具有 int 64 位。

参见例如this reference of integer types 获取更多信息。

虽然标准保证 int 的大小为 16 位,但通常实现为 32 位值。

你误会了。标准 保证 int 持有 [-32767, +32767],但 允许 持有更多。 (特别是,您可能使用的几乎每个编译器都允许范围 [-2147483648, 2147483647])。

还有一个问题。如果您将分配给 a 和 b 的值设置得更大 ,您仍然可能不会收到任何警告或错误。整数溢出导致 "undefined behaviour",实际上任何事情都允许发生。

int 的大小(以及它可以容纳的最大值)取决于编译器和您使用的计算机。不能保证它将有 2 个字节或 4 个字节,但有一个 保证的最小大小 c++ 变量。

您可以在此页面中查看 C++ 类型的最小大小列表:http://www.cplusplus.com/doc/tutorial/variables/

如果一个 int 是四个字节,一个 unsigned 是 4294967295,signed max。 2147483647 并签署了分钟。 -2147483648

unsigned int ui = ~0;
int max = ui>>1;
int min = ~max;
int size = sizeof(max);