我在 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/