为什么我可以使用int> +32767?

时间:2016-01-15 13:19:09

标签: c++ int range undefined-behavior

我可以读到int范围(签名)来自[-32767,+ 32767] 但我可以说,例如

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

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

输出为141000(正确)。调试器不应该告诉我 “此操作超出范围”或类似的东西?

我认为这必须与我无视C编程的基础知识,但我目前正在阅读的所有书籍都没有说明这个“问题”。

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

7 个答案:

答案 0 :(得分:6)

范围[-32767,+ 32767]是必需的最小范围。允许实现提供更大的范围。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

所有类型都依赖于编译器。 int曾经是底层硬件的“本地字”,在16位系统上意味着int是16位(这导致-32k到+ 32k范围)。当32位系统开始出现时,int自然跟随并成为32位,可以存储大约20亿到+20亿的值。

然而,当{64}系统出现时,这个用于int的“本地词”没有跟随,我知道没有64位系统或编译器int是64位。

参见例如this reference of integer types了解更多信息。

答案 3 :(得分:2)

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

还有另一个问题。如果您将分配给a和b的值更大,那么您仍然可能不会收到任何警告或错误。整数溢出会导致“未定义的行为”,并且允许任何事情发生。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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