我对为什么这不会导致错误感到困惑。
void f(int I) {
++I;
if (I > INT_MAX) {
printf("OVERFLOW\n");
} else {
printf("NO OVERFLOW\n");
}
}
int main(void) {
f(INT_MAX);
printf("DONE\n");
}
我正在用C语言编写代码,而我的学校已经将INT_MAX定义为 $ 2 ^ {31}-1 $ ,我想它是什么。< / p>
答案 0 :(得分:1)
这可以使您在两条不同的路线上不会出现过流量:
if
被编译为简单的printf("NO OVERFLOW\n");
。2147483647+1=-2147483648
在数学上没有意义,但这是设计功能。这使得在正数上添加较大的负数效果很好。只是您需要记住使用正确的类型来保存您的数字。(我假设一个“正常的” 32位整数,但是某些架构使用不同的大小,例如,在AVR8整数上,其长度为16位。)
答案 1 :(得分:1)
OVERFLOW
在您的情况下将不会打印。您遇到的情况是:当您的I
已经达到最大值时,如果您使用++I
进一步增加它,它将回绕到最小值。插图:
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
void f(int I) {
++I;
printf("\nAfter incrementing I: %d\n", I);
if (I > INT_MAX) {
printf("OVERFLOW\n");
} else {
printf("NO OVERFLOW\n");
}
}
int main(void) {
f(INT_MAX);
printf("DONE\n");
}
输出:
After incrementing I: -2147483648
NO OVERFLOW
DONE