C/C++ 判断整数相加是否溢出

算术方法,或者内联汇编判断溢出标志位

方法1:算术方法,根据运算结果判断。
这种判断方法非常直接。

int isAddOverflow1(int x, int y)
{
    int z = x + y;
    if(x > 0 && y > 0 && z < 0)
        return 1;  
    if(x < 0 && y <  0 && z > 0)
        return 1;
    return 0;
}

方法2:从 CPU 读取溢出标志位。
8086 的控制寄存器里的标志寄存器 FLAG 里有个 OF 溢出标志位,如果上一次运算发生溢出,该位会被置 1。使用 jo 指令可依该标志位跳转。
采用内联汇编。以下代码是 VC 的写法。gcc 相应的关键字是 __ASM__。

//compile with MSVC, run on 8086
int isAddOverflow2(int a, int b) {
    __asm {
        mov eax,a
        add eax,b
        jo  overflowed
        xor eax,eax
        jmp no_overflowed
overflowed:
        mov eax,1
no_overflowed:
    }
}

可采用以下程序进行测试:

#include 
int isAddOverflow1(int x, int y);
int isAddOverflow2(int a, int b);
int main() {
    int a,b;
    int samplesA[]={-23333, -1, 0, 1, 2, 2333333};
    int nSamplesA = sizeof(samplesA)/sizeof(int);
    int samplesB[]={233333, 2147483647, -2147483647, -2147483648};
    int nSamplesB = sizeof(samplesB)/sizeof(int);
    for(int iA=0; iA

如有其他方法,欢迎评论补充。本文整理自网上资料。(完)

1 thought on “C/C++ 判断整数相加是否溢出”

发表评论

电子邮件地址不会被公开。 必填项已用*标注