小编Cod*_*bat的帖子

c 中整数的环绕

我已经用 c 编程有一段时间了。但从未使用过发生整数环绕的程序。我知道如果整数分配了4个字节,那么整数的范围就变成-2,147,483,648到2,147,483,647。如果我们超过了限制,它就会绕回。

我正在使用以下程序来了解环绕是如何发生的。

#include <stdio.h>

int main() {
int n = 4, s = 2;

for (int i = 0; i < n; ++i)
{
    for (int j = 0; j < n; ++j)
    {
        for (int k = 0; k < n; ++k)
        {
            s = 2 * s + 1;

        }
    }
}
printf("%d\n", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 gdb 来找出变量 s 所取的值。我发现当我们执行最里面的循环第30次时,s的值变成负数,即-1073741825。然后,对于下一次迭代,它变为 2147483647,对于第 32 次迭代,它变为 -1。gdb 的快照

然后它永远保持为-1。我的疑问是为什么值变为-1后没有发生回绕。我知道二进制中 s 的值将全为 1 或十六进制中的 FFFFFFFF 。而且它不会永远改变(它在内部更新,但我们只能看到最后 32 位,所以它是 -1)。但是这次环绕没有出现吗?它依赖于编译器吗?或者 …

c integer-overflow

2
推荐指数
1
解决办法
6447
查看次数

标签 统计

c ×1

integer-overflow ×1