【问题标题】:converting from unsigned long long to unsigned int从 unsigned long long 转换为 unsigned int
【发布时间】:2016-12-20 19:33:06
【问题描述】:

我正在四处寻找这个问题的答案,但找不到明确的答案。
我看到this 的答案是他写的附注:

无符号类型的规则不同;转换的结果 有符号或无符号整数到无符号类型的定义很好。

那么定义明确的行为是什么?
unsigned long long 转换为unsigned int 时,是否有定义的行为?它只是切断32个MSB吗? (留给我 32 个 LSB)。
让我们假设在我的系统中 sizeof(unsigned int)4sizeof(unsigned long long)8
在不强制转换的情况下分配和使用强制转换分配时是否有不同的行为?

【问题讨论】:

    标签: c type-conversion


    【解决方案1】:

    标准说:

    6.3.1.3 有符号和无符号整数
    1 当一个整数类型的值被转换为除_Bool之外的另一个整数类型时,如果该值 可以用新的类型来表示,它是不变的。
    2 否则,如果 新类型是无符号的,通过重复添加转换值 或比可以表示的最大值多减一 在新类型中,直到值在新类型的范围内。 49)
    3 否则,新类型有符号,值无法表示 在里面;结果是实现定义的或 引发了实现定义的信号。

    第 2 点描述了一个模运算,在这种情况下,它与切断 MSB 具有相同的效果。 (当新类型的最大值加一为底数的幂时,效果相同。)

    如果你使用强制转换没有区别。

    【讨论】:

    • 感谢您引用标准并回答我的具体案例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多