【问题标题】:int divided by unsigned int causing rolloverint 除以 unsigned int 导致翻转
【发布时间】:2011-07-16 17:49:40
【问题描述】:

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


    【解决方案1】:

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

    res = b / c;
    

    到:

    res = b / (int)c;
    

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

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

    【讨论】:

    • 这就是为什么具有隐式类型转换的语言是邪恶的。如果您不希望这种垃圾发生在您身上,请使用具有真正强大类型系统的语言,例如 Ada。
    • 使cunsigned short 在上下文中更有意义的话也可以。
    猜你喜欢
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多