C ++:将unsigned long long转换为unsigned long

时间:2015-04-21 22:28:51

标签: c++ unsigned

我正在尝试将unsigned long long转换为unsigned long。以下是正确的方法吗?

unsigned long removeExtraBits2(unsigned long long c) {
    return (unsigned long) ((c << 32) >> 32);
}

如果没有,你能提供一个有效的例子吗?

我的假设是,当向左移动,然后向右移动时,最左边的32位被设置为0.

谢谢!

编辑:转换的目的是去除额外的位,“高于”32位,实际上只保留最右边的32位为无符号长。

2 个答案:

答案 0 :(得分:8)

只需进行“普通”演员((unsigned long)c,或者,如果您喜欢详细程度,static_cast<unsigned long>(c),或者只是将unsigned long long来源值分配给unsigned long目标变量),该标准保证左侧的额外位将被截断。

  

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n ,其中n是用于表示无符号类型的位数)。 / p>

(C ++ 11,§4.7¶2)

,如果源是无符号的(或者是带符号和2的补码算术),则可以说是额外的位被截断的一种奇特的方式。

答案 1 :(得分:0)

有许多不同的处理器和操作系统。 unsigned long long几乎就是64位。 unsigned long是另一个故事。例如,Linux x86-64上的 64 -bits,Linux x86-32上的 32 -bits和Windows x86上的 32 -bits- 64和x86-32。普通转换可能是noop。

我认为这是一个安全的解决方案。

unsigned long removeExtraBits(unsigned long long c) {
    c %= 0x100000000ULL;
    return (unsigned long)(c);
}

编译器会将%更改为简单mov