C++:double vs unsigned int.为什么会像这样运行?

Jav*_*ner 2 c++ double int unsigned

我试着乘以三个数字,但我得到一个奇怪的结果.为什么我得到如此不同的结果?

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
Run Code Online (Sandbox Code Playgroud)

eps*_*lon 9

在第一个示例中,数字-2将转换为unsigned int.乘法结果为-112,当表示为无符号时为2 ^ 32 - 112 = 4294967184.然后,此结果最终转换double为赋值.

在第二个示例中,所有数学都在双精度数上完成,从而得到正确的结果.如果您这样做,您将获得相同的结果:

double d3 = -2.0 * a * b
Run Code Online (Sandbox Code Playgroud)

作为-2.0是一个double文字.