我在C++中使用整数除法面临一些奇怪的结果。我正在计算这个: -2147483648/-1 。
我得到的是在3种不同情况下的3种不同结果:
int foo(int numerator, int denominator) {
int res = numerator / denominator; // produces SIGFPE, Arithmetic exception interrupt
cout << res << endl;
}
int main() {
int res = -2147483648 / -1;
cout << res << endl; // prints -2147483648
cout << -2147483648 / -1 << endl; // prints 2147483648
foo(-2147483648, -1);
return 0;
}
为什么整数除法在不同情况下会产生不同的结果?
最佳答案
文字-2147483648 / -1
由编译器计算为2147483648
,其数据类型足以容纳该值。
直接打印文字时,它将正确打印该值。
当文字存储在res
中时,将其转换为int
。 int
在您的系统上似乎为32位宽。值2147483648
不能表示为32位带符号整数,因此强制转换会导致溢出。在您的系统上,此溢出导致值-2147483648
(可能使用二进制补码)。
最后,当尝试在运行时执行除法时(在foo
函数中),由于溢出(由于SIGFPE
数据类型无法表示结果)而导致int
异常。
请注意,所有这三个选项都依赖于平台相关的行为:
int
溢出会生成该特定值(并且没有其他问题)的事实SIGFPE
异常关于c++ - C++整数除法如何处理极限值和负值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38769856/