为什么我可以用 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_MIN
和 INT_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);
我可以读出整数范围(有符号)来自 [−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_MIN
和 INT_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);