You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于C语言的有符号4位整数减法溢出检测代码问题排查

有符号4位整数减法溢出检测问题

我针对有符号4位整数算术运算编写了以下C代码用于检测减法溢出,但输入7和-6(执行7 - (-6)操作,按4位有符号整数规则应发生溢出)时,程序判定无溢出;调换输入顺序后结果仍错误。想知道是差值计算方式错误还是代码逻辑存在问题,希望代码能匹配正确的溢出判定逻辑。

原代码

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

问题分析

  1. 类型不匹配:C语言的int默认是32位/64位,7 - (-6) = 13在该范围内完全不会溢出,程序自然判定无溢出——你需要模拟4位有符号整数的运算规则,而非直接用标准int。
  2. 溢出判定的基础错误:你的逻辑虽然抓住了「减法仅在被减数与减数符号相反时可能溢出」的要点,但实际运算用的是标准int,溢出后的结果不会符合4位有符号数的截断规则,导致判定失效。

修正后的代码(模拟4位有符号整数运算)

#include <stdio.h>

// 模拟4位有符号整数的减法溢出检测
int tsub_ok_4bit(int x, int y) {
    // 将输入值截断为4位,并转换为有符号数(4位有符号范围:-8 ~ 7)
    x = x & 0xF;
    if (x & 0x8) x -= 16; // 最高位为1时,转换为负数

    y = y & 0xF;
    if (y & 0x8) y -= 16;

    int dif = x - y;
    // 对差值做4位截断,再转换为有符号数
    int dif_4bit = dif & 0xF;
    if (dif_4bit & 0x8) dif_4bit -= 16;
    printf("4位运算差值: %d\n", dif_4bit);

    // 溢出判定逻辑:被减数与减数符号相反,且运算结果符号与被减数不同
    if ((x >= 0 && y < 0) || (x < 0 && y >= 0)) {
        if ((x >= 0 && dif_4bit < 0) || (x < 0 && dif_4bit >= 0)) {
            printf("OVERFLOW\n");
            return 0;
        } else {
            printf("No Overflow!!\n");
            return 1;
        }
    } else {
        printf("No Overflow!!\n");
        return 1;
    }
}

int main() {
    int x, y;
    scanf("%d %d", &x, &y);
    int ans = tsub_ok_4bit(x, y);
    printf("%d\n", ans);
    return 0;
}

修正说明

  • 先通过& 0xF截断输入值到4位,再根据最高位(第4位)判断是否为负数,转换为4位有符号数的实际值(范围-8到7)。
  • 计算差值后同样做4位截断与符号转换,模拟4位CPU的运算结果。
  • 溢出判定逻辑:当被减数x与减数y符号相反时,若4位运算结果的符号与x不同,则说明溢出。例如7 - (-6)实际是7+6=13,4位截断后为1101,对应-3,符号从正变负,触发溢出判定。

内容的提问来源于stack exchange,提问作者Erique

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:34:50