我尝试乘以三个数字,但我得到一个奇怪的结果。为什么我得到如此不同的结果?C++:double与unsigned int。为什么它像这样运行?
unsigned int a = 7;
unsigned int b = 8;
double d1 = -2 * a * b;
double d2 = -2 * (double) a * (double) b;
double d3 = -2 * (a * b);
// outputs:
// d1 = 4294967184.000000
// d2 = -112.000000
// d3 = 4294967184.000000
感谢您的解释!但为什么:“-122”我们在这里:“2^32 - 122”?什么是“122”? – JavaRunner
这不是它的工作原理。数字“-2”被转换为“unsigned int”。在32位整数的机器上,'-2'变成4294967294.乘以56(7 * 8)不会产生-112。它怎么样?它产生了一个相当大的数字,240518168464.这对于'unsigned int'来说太大了。这变成4294967184,因为使用无符号整数*,无法用结果无符号整数类型表示的结果减少了模数,该数字大于可以由所得无符号整数类型*表示的最大值的数字*(换句话说,模2^n)。 –