用 C 代码确定减法溢出

问题描述 投票:0回答:1
#include <stdio.h>

int tsub_ok(int x, int y);

int tsub_ok(int x,int y)
{
    int dif = 0; //The difference of our two numbers.
    dif = x - y; //X is the minuhend. Y is the subtrahend.
    printf("DIFFERENCE: %d\n", dif); //Output difference.

    if ((x >= 0 && y < 0) || (x < 0 && y >= 0)) { //IF THE SIGNS ARE DIFFERENT (they have to be)
        if (x >= 0 && y < 0 && dif < 0) { //MINUHEND IS POSITIVE, SUBTRAHEND IS NEGATIVE, AND DIFFERENCE IS NEGATIVE. (OVERFLOW OCCURS)
            printf("OVERFLOW\n");
            return 0;
        }
        else if (x < 0 && y >= 0 && dif >= 0) { // MINUHEND IS NEGATIVE, SUBTRAHEND IS POSITIVE, DIFFERENCE IS POSITIVE. (OVERFLOW OCCURS)
            printf("OVERFLOW\n");
            return 0;
        }
        else {
            printf("No Overflow!!\n"); //Overflow does NOT occur in any other condition.
            return 1;
        }
    } 
    else { //IN ANY OTHER CONDITION, THERE IS NO OVERFLOW.
        printf("No Overflow!!\n");
        return 1;
    }
}

int main() {
    int x, y;

    scanf("%d %d", &x, &y);
    int ans = tsub_ok(x, y);
    printf("%d\n", ans);

    return 0; 
}

我有这段代码来确定是否发生减法溢出。但是当我输入 7 和 -6(它们之间发生减法时应该溢出的数字)时,我得到相反的结果。这是因为我如何计算“dif”变量吗?应该是 y - x 吗?还是我的代码不正确?

因为我知道如果你从 7 中减去 -6,就会发生溢出。但无论我输入-6然后7,还是7然后-6,我的程序都声称没有发生溢出。

编辑我忘记提供上下文图像。这就是我所说的溢出的意思,它有从 7 中减去 - 6 的示例。我只想让我的代码模拟屏幕截图中显示的示例。

c overflow
1个回答
0
投票

避免溢出

函数的早期部分是

dif = x - y;
,可能会溢出,导致未定义的行为(UB)并使其余代码变得毫无意义。
删除那行代码。

A 简单减法测试

#include <limits.h>

int is_undefined_sub1(int a, int b) {
  return (b < 0) ? (a > INT_MAX + b) : (a < INT_MIN + b);
}
© www.soinside.com 2019 - 2024. All rights reserved.