从C陷阱和陷阱
如果a和b是两个整数变量,已知是非负的,则测试是否
a+b可能溢出使用:Run Code Online (Sandbox Code Playgroud)if ((int) ((unsigned) a + (unsigned) b) < 0 ) complain();
我没有得到如何比较两个整数与零的总和会让你知道有溢出?
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)
这是可能的,因为无符号算术被定义为包装,这与在溢出时调用未定义行为的有符号算法不同.