{
int i=1;
while(i<=32767)
{
printf("%d",i);
i=i+1;
}
}
这似乎是一个打印1到32767的简单程序...但是当我达到32767时......将值递增1 .....它会尝试转到32768,它超出整数范围并转到另一边是-32768 .....由于哪个条件变为真,因为i&lt; = 32767即-32768 .....所以它应该作为无限循环工作。 我的Dev C ++编译器只打印1到32767 ....它不能作为无限循环。 任何人
答案 0 :(得分:10)
您平台上整数的大小大概是&gt; 16位。
ISO / IEC 9899:201x状态
int类型对象的最小值
INT_MIN -32767 // - (2 15 - 1)
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
事实上,如今大多数平台上的大多数C编译器都会有比16位更大的整数。
在C中,保证整数至少 16位。假设它是特定大小是危险和不可移植的。经常检查。
答案 1 :(得分:3)
首先,您确定平台int
的范围在32767
溢出吗?大多数现代平台使用4字节int
,这意味着它的范围比-32768..+32767
大得多。
其次,有符号整数溢出在C和C ++中产生未定义的行为。您对32767
在增量上变为-32768
并且循环变为无限的期望是完全没有根据的。该语言不保证这样的东西。当溢出发生时,您的程序可能会崩溃(某些编译器可能会故意生成代码,以确保程序在此类溢出时被中断)。
第三,一些现代编译器实现了所谓的严格溢出语义(GCC就是一个例子)。由于有符号整数溢出会产生未定义的行为,因此编译器可以以它认为合适的任何方式自由地转换代码。编译器可以将其转换为无条件无限循环。或者它可以将其转换为一些或多或少定义明确的终止循环。