基于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; }
问题分析
- 类型不匹配:C语言的
int默认是32位/64位,7 - (-6) = 13在该范围内完全不会溢出,程序自然判定无溢出——你需要模拟4位有符号整数的运算规则,而非直接用标准int。 - 溢出判定的基础错误:你的逻辑虽然抓住了「减法仅在被减数与减数符号相反时可能溢出」的要点,但实际运算用的是标准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
相关产品推荐
相关产品推荐

