我一直在用c编程一段时间。但从来没有使用整数环绕的程序。我知道如果整数分配4个字节,那么整数范围变为-2,147,483,648至2,147,483,647。如果我们超过了限制,它只是环绕一下。在c中包含整数的部分
我正在使用下面的程序来了解如何环绕发生。
#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;
}
我使用gdb来找出变量s所采用的值。我发现当第30次执行最内层循环时,s的值变为负值,即-1073741825。然后下一次迭代变成2147483647,第32次迭代变成-1。
然后它永远保持为-1。我怀疑为什么在值变为-1后没有发生缠绕。我知道二进制中s的值将全部为1或FFFFFFFF(十六进制)。它永远不会改变(内部它正在更新,但我们只能看到最后32位,所以它是-1)。但这次环绕不会进入画面吗?它依赖于编译器吗?或者,gcc是否只允许环绕一次? 任何形式的帮助,将不胜感激。谢谢
简短回答:适当的环绕保证*只*为无符号类型。使用签名类型,可能会发生奇怪的事情,因为它在技术上是不确定的。 –
它不再更新,因为'2 *( - 1)+ 1 = -1'。 –