int left = std::numeric_limits<int>::min();
int right = -1;
//the code below instead of give one more than int_max gives: 18446744071562067968
unsigned long long result = left * right;
我已经尝试查找 UAC,但即使根据 UAC 规则,这也应该会产生正确的输出。知道为什么结果不正确吗?
最佳答案
将带符号的 2 的补码 int
的最小值乘以 -1 是未定义的行为,因为结果超出了类型的范围。
在这种情况下,您的输出与 -2147483648 的结果一致,即溢出似乎已经环绕。您不能依赖有符号类型的环绕,只能依赖无符号类型。
将计算结果赋值给 unsigned long long
不会改变执行计算的类型。只要你做乘法,你就输了。因此,将其中一个操作数转换为 unsigned long long
before 乘法。
关于c++ - 整数转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13526966/