【发布时间】:2016-12-10 17:24:33
【问题描述】:
我在 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行上显示negative integral constant converted to unsigned type和unary minus operator applied to unsigned type, result still unsigned的代码无法在 Windows VS-2015 上编译 -
简单回答here.
-
这就是视觉工作室的做法:
#define INT_MIN (-2147483647 - 1) // minimum (signed) int value -
@usr
2147483648甚至在考虑一元-之前就是 UB。所以 VC 定义通过避免2147483648文字来解决这个问题。 -
@flatmouse:我猜他们错误地使用了适用于积分促销的列表,即“int、unsigned int、long int、unsigned long int、long long int 或 unsigned long long int”或者他们使用用于二进制/八进制/十六进制文字的列表,而不是用于十进制文字的列表。至于为什么二进制/八进制/十六进制文字的规则不同,我相信这是因为程序员正在控制文字的长度,以位为单位。实际上,我希望看到
auto x = 0x0000000000000001;自动成为符合int64_least_t理念的任何基本类型
标签: c++ integer precision 16-bit integer-division