以下循环应该以2开始递归地相乘一个值。在一些迭代之后,该值似乎为0而不是增长的数字。
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
for (i = 2; ; i = i * i) {
printf("%d\n", i);
}
}
有人可以解释一下为什么吗?有没有办法解决它?
答案 0 :(得分:20)
C中的普通int
为signed
。 for
中没有条件表达式来打破循环。这使得它无限,导致signed integer overflow并最终调用undefined behavior。在这种情况下,你不能指望任何好处。
答案 1 :(得分:18)
在这种情况下,如果溢出,它将很快达到零(假设处理溢出的方式非常基本)。查看二进制操作:
C Bits
0 00000010
0 00000100
0 00010000
1 00000000
所以你看到对于一个8位整数,溢出会给你零(而不是其他一些数字,或者你用有符号整数得到的-128)。
在5次迭代中,32位整数完全相同。