我正在使用C的基本sintax,我提出了以下代码:
#include <stdio.h>
int main() {
int a = 1000;
int b = 0;
while (a > b) {
a++;
b++;
}
puts("Loop ended");
}
令人难以置信的是,即使Loop ended
总是大于a
,这个程序也会输出b
,无论我增加多少:我的意思是1001&gt; 1与2481298241一样真实&gt; 2481297241。
请解释一下这种奇怪行为的原因是什么。
答案 0 :(得分:5)
您所面对的是Integer overflow。
在计算机编程中,算术时会发生整数溢出 操作尝试创建一个太大的数值 在可用存储空间内表示。
虽然在溢出发生时导致其UB,但这只是偶然的问题。
由于算术运算可能产生大于的结果 最大可表示值,可能导致潜在的错误情况。 在C编程语言中,有符号整数溢出导致 未定义的行为,而无符号整数溢出导致数字 以模2的幂为模,即无符号整数 溢出时“环绕”。这种“环绕”是原因 Pac-Man着名的“分屏”。[2] “环绕”对应于 事实上,例如,如果增加两个正整数产生 溢出,可能会导致意外结果。例如用 无符号32位整数,4000000000u + 1000000000u = 705032704u。
答案 1 :(得分:3)
TL; DR回答:在您的情况下,没有检查a
的值。因此,递增操作将使int a
值在某个时间点溢出。 signed
数据类型溢出的结果[在代码中使用]未定义。在这种情况下,它会使a>b
评估为false。
注意:但是,如果是无符号数据类型,
涉及无符号操作数的计算永远不会溢出,因为无法用结果无符号整数类型表示的结果是以比结果类型可以表示的最大值大1的数量的模数减少的。
答案 2 :(得分:3)
这是一个表示错误,最终将溢出int容器并且将小于B.想象它像汽车里程表,它最终会说0但这并不意味着你有一个全新的引擎: )
答案 3 :(得分:1)
溢出。在轻武器中的蓄水池只能这样,然后stils。然后地板上的水等于
PS:这是一个比喻
答案 4 :(得分:0)
正如所有其他答案所指出的那样,整数溢出问题,尝试检查确实是这个代码
#include <stdio.h>
#define MAXINTEGER 2147483647
int main()
{
int a = 1000;
int b = 0;
while (a > b)
{
a++;
b++;
if (a == 2147483647)
{
puts("a reached it's maximum value, exiting");
exit(0);
}
}
puts("Loop ended");
return 0;
}
最大有符号32位整数值为2147483647
。