int除以unsigned int导致翻转

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

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

PS

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

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

 res = b / c; 

至:

 res = b / (int)c; 

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

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