我尝试将 int 除以 unsigned int 并得到意想不到的结果:
int b;
unsigned int c;
int res;
float res_f;
b = -25;
c = 5;
res = b / c; // res = 858993454
res_f = b / c; // res_f = -5.000000
同样适用于“+”、“-”和“*”,但对“/”无效。我在这里想念什么?
附言
它在不同的编译器上进行了测试,结果是相同的。
我尝试将 int 除以 unsigned int 并得到意想不到的结果:
int b;
unsigned int c;
int res;
float res_f;
b = -25;
c = 5;
res = b / c; // res = 858993454
res_f = b / c; // res_f = -5.000000
同样适用于“+”、“-”和“*”,但对“/”无效。我在这里想念什么?
附言
它在不同的编译器上进行了测试,结果是相同的。
假设这是 C 或类似的(例如 Objective C),更改:
res = b / c;
至:
res = b / (int)c;
解释: b 正在根据 C 的混合表达式的类型转换规则从int
转换为 。unsigned int
在此过程中,它从 溢出-25
到0xFFFFFFE7 == 4294967271
。然后得到 的unsigned int
结果4294967271 / 5U = 858993454U
,然后将其隐式转换回int
(在此步骤中没有溢出,因为结果在有符号和无符号 32 位整数的范围内)。
顺便说一句,float
结果应该是相同的,在float
(I get 858993472.0
) 的精度范围内。我很惊讶在这种情况下你得到 -5.0。