示例代码:
int main(void)
{
int a = 5;
int b = -2;
unsigned int c = 5;
double d = a + b - c - 0.5;
double e = a + b - 1.0 * c - 0.5;
printf("d: %g\n", d);
printf("e: %g\n", e);
return 0;
}
结果:
d: 4294967293.5
e: -2.5
看上去 c 的取值错了。
当
unsigned int
和int
相加减的时候,int类型会被转换为unsigned int
类型,并且运算的结果也是unsigned int
类型。double d = a + b - c - 0.5
相当于double d = (unsigned int)a + (unsigned int)b - c - 0.5
,而unsigned int(-2)
为4294967294
,所以5 + 4294967294 - 5 - 0.5
为4294967293.5
。而
double e = a + b - 1.0 * c - 0.5
,因为先算乘除,所以首先(1.0 * c)
会被转为double类型,所以5 + -2 - 5.0 - 0.5
等于-2.5