我在玩C的基本正弦波,然后想到了以下代码:
#include <stdio.h>
int main() {
int a = 1000;
int b = 0;
while (a > b) {
a++;
b++;
}
puts("Loop ended");
}
令人难以置信的Loop ended
是,即使我总是增加它们,该程序的输出也a
总是大于b
:我的意思是1001> 1与2481298241> 2481297241一样为True。
请向我解释这种奇怪行为的原因是什么。
您面临的是整数溢出。
在计算机编程中,当算术运算试图创建一个太大而无法在可用存储空间中表示的数值时,就会发生整数溢出。
尽管发生溢出时会导致其UB,但这只是一个偶然的问题。
由于算术运算可能会产生大于最大可表示值的结果,因此可能会导致潜在的错误情况。在C语言中,有符号整数溢出会导致未定义的行为,而无符号整数溢出会导致该数字以2的幂进行模减少,这意味着无符号整数会在溢出时“环绕”。这种“环绕”是吃豆人中著名的“分屏”的原因。[2] “环绕”对应于以下事实:例如,如果两个正整数相加会产生溢出,则可能会导致意外结果。例如,使用无符号的32位整数4000000000u + 1000000000u = 705032704u。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句