int除以unsigned int导致翻转

时间:2011-03-16 16:17:35

标签: c arithmetic-expressions

我尝试用unsigned int划分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

同样适用于'+',' - '和'*',但是'/'失败。我想念的是什么?

P.S。

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

1 个答案:

答案 0 :(得分:11)

假设这是C或类似(例如目标C),请更改:

res = b / c;

为:

res = b / (int)c;

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

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