测试两个整数之和是否可能溢出

Cha*_*hak 7 c

从C陷阱和陷阱

如果a和b是两个整数变量,已知是非负的,则测试是否a+b可能溢出使用:

     if ((int) ((unsigned) a + (unsigned) b) < 0 )
        complain();
Run Code Online (Sandbox Code Playgroud)

我没有得到如何比较两个整数与零的总和会让你知道有溢出?

R..*_*R.. 17

你看到的用于测试溢出的代码只是假的.

对于有符号整数,您必须像这样测试:

if (a^b < 0) overflow=0; /* opposite signs can't overflow */
else if (a>0) overflow=(b>INT_MAX-a);
else overflow=(b<INT_MIN-a);
Run Code Online (Sandbox Code Playgroud)

请注意,如果两个数字中的一个是常数,则可以简化案例.

对于无符号整数,您可以像这样测试:

overflow = (a+b<a);
Run Code Online (Sandbox Code Playgroud)

这是可能的,因为无符号算术被定义为包装,这与在溢出时调用未定义行为的有符号算法不同.