问题描述
该代码用于检测是否会发生整数溢出:
int tadd_ok(int x,int y) {
if ((x < 0) && (y < 0)) {
if ((INT_MIN - x) > y) {
return 0;
}
}
if ((x > 0) && (y > 0)) {
if ((INT_MAX - x) < y) {
return 0;
}
} else
return 1;
}
使用输入:
printf("Check TADD\n");
printf("1 + 1: %d\n",tadd_ok(1,1));
printf("1 + 2: %d\n",2));
printf("-1 + -1: %d\n",tadd_ok(-1,-1));
printf("-1 + 1: %d\n",1));
printf("1 + -1: %d\n",-1));
printf("INT_MAX + 1: %d\n",tadd_ok(INT_MAX,1));
printf("INT_MAX + -1: %d\n",-1));
printf("INT_MAX + 2: %d\n",2));
printf("INT_MIN + -1: %d\n",tadd_ok(INT_MIN,-1));
printf("INT_MIN + 1: %d\n",1));
我得到输出:
Check TADD
1 + 1: 2147483646
1 + 2: 2147483646
-1 + -1: 1
-1 + 1: 1
1 + -1: 1
INT_MAX + 1: 0
INT_MAX + -1: 1
INT_MAX + 2: 0
INT_MIN + -1: 0
INT_MIN + 1: 1
由于某些原因,当输入两个正数时,将返回INT_MAX - 1
的某些信息。我不确定这是怎么回事。我唯一的猜测是我会在测试中引起不确定的行为,但是如果我正确理解,(INT_MAX - x)
应该是唯一有问题的测试,并且只要x
是肯定的,那应该是来自先前的测试,这不会引起溢出。
解决方法
您掉到了函数结尾,返回了一个随机数。我认为您需要将else return 1;
更改为return 1;
在C语言中,返回除void以外的内容的函数以return语句或无限循环结尾。由于历史原因,返回类型为int的函数不会产生错误,但应使用未指定的值。
,您的函数中存在一个错误:如果return
而不是x > 0 && y > 0
,则该函数不会命中(INT_MAX - x) >= y)
语句。如果配置正确,任何现代编译器都会对此发出诊断:始终询问大多数警告并加以解决(例如:gcc -Wall Werror
)。
这是修改后的版本:
int tadd_ok(int x,int y) {
if (x < 0 && y < 0) {
if ((INT_MIN - x) > y)
return 0;
}
if (x > 0 && y > 0) {
if ((INT_MAX - x) < y)
return 0;
}
return 1;
}
这是一个简化的版本:
int tadd_ok(int x,int y) {
if (x < 0)
return y >= INT_MIN - x;
else
return y <= INT_MAX - x;
}