为什么这两个值会产生零输出。我以为它会产生一个算术溢出,但就像a和b一样,符号是相反的。
#include <stdio.h>
// trying to generate an arithmetic overflow
int sum(int a, int b) {
return a + b;
}
int main()
{
int a=2147483648;
int b=2147483648;
printf("%d", sum(a,b));
return 0;
}发布于 2019-05-15 11:54:30
对于您的特定计算机上的特定编译器,int a=2147483648;在本质上与被视为int a=INT_MIN;的int a=INT_MAX+1;相同,对于int b也是如此,这导致了return INT_MIN+INT_MIN;,实际上类似于"0x80000000 + 0x80000000 = 0x100000000 = 0x00000000 with overflow“。
然而,以上所有情况都依赖于未定义的行为(假设未定义的行为在实践中意外地导致了包装)。
通常,您希望使用unsigned int (或者更好的uint32_t)来避免未定义的行为,并获得您所希望的“预期溢出”。
https://stackoverflow.com/questions/56141000
复制相似问题