7

我尝试将 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

同样适用于“+”、“-”和“*”,但对“/”无效。我在这里想念什么?

附言

它在不同的编译器上进行了测试,结果是相同的。

4

1 回答 1

14

假设这是 C 或类似的(例如 Objective C),更改:

res = b / c;

至:

res = b / (int)c;

解释: b 正在根据 C 的混合表达式的类型转换规则从int转换为 。unsigned int在此过程中,它从 溢出-250xFFFFFFE7 == 4294967271。然后得到 的unsigned int结果4294967271 / 5U = 858993454U,然后将其隐式转换回int(在此步骤中没有溢出,因为结果在有符号和无符号 32 位整数的范围内)。

顺便说一句,float结果应该是相同的,在float(I get 858993472.0) 的精度范围内。我很惊讶在这种情况下你得到 -5.0。

于 2011-03-16T16:25:42.243 回答