C中的二进制补码溢出

Rsh*_*Rsh 5 c debugging

我在C中看到了一个有缺陷的代码,用于检查添加是否导致溢出.它工作正常char,但在参数出现时给出错误的答案int,我无法理解为什么.
这是带short参数的代码.

short add_ok( short x, short y ){
    short sum = x+y;
    return (sum-x==y) && (sum-y==x);
}
Run Code Online (Sandbox Code Playgroud)

这个版本工作正常,当您更改参数时出现问题int(您可以查看INT_MAX)
你能看到这里有什么问题吗?

Oli*_*rth 5

因为在2s补码中,整数可以排列成一个圆(在模运算的意义上).添加y然后减去y总会让你回到你开始的地方(尽管有未定义的行为).


R..*_*R.. 5

在您的代码中,除非大小相同,否则添加不会溢出.由于默认促销,对值和升级执行,然后结果将以实现定义的方式截断.intshortx+yxyintshort

为什么不简单地做: return x+y<=SHRT_MAX && x+y>=SHRT_MIN;