在C语言中,仅应返回文字1或0的函数将返回2147483646?

问题描述

代码用于检测是否会发生整数溢出:

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;
}