乘法导致零

时间:2016-03-23 16:39:22

标签: c

以下循环应该以2开始递归地相乘一个值。在一些迭代之后,该值似乎为0而不是增长的数字。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int i;
    for (i = 2; ; i = i * i) {
        printf("%d\n", i);
    }
}

有人可以解释一下为什么吗?有没有办法解决它?

2 个答案:

答案 0 :(得分:20)

C中的普通intsignedfor中没有条件表达式来打破循环。这使得它无限,导致signed integer overflow并最终调用undefined behavior。在这种情况下,你不能指望任何好处。

答案 1 :(得分:18)

在这种情况下,如果溢出,它将很快达到零(假设处理溢出的方式非常基本)。查看二进制操作:

C  Bits
0  00000010
0  00000100
0  00010000
1  00000000

所以你看到对于一个8位整数,溢出会给你零(而不是其他一些数字,或者你用有符号整数得到的-128)。

在5次迭代中,32位整数完全相同。

相关问题