C++:将无符号长整型长整型转换为无符号长整型

C++: convert unsigned long long to unsigned long

本文关键字:长整型 无符号 转换 C++      更新时间:2023-10-16

我正在尝试将无符号长长转换为无符号长。以下方法是否正确?

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

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

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

谢谢!

编辑:转换的目的是摆脱多余的位,"高于"32位,有效地只将最右边的32位保留到无符号的长整型中。

只需执行"普通"强制转换((unsigned long)c,或者,如果您喜欢冗长,static_cast<unsigned long>(c),甚至只是将unsigned long long源值分配给unsigned long目标变量),标准保证左侧的额外位将被截断。

如果目标类型是无符号的

,则结果值是与源整数全等的最小无符号整数(模 2n,其中 n 是用于表示无符号类型的位数)。

(C++11, §4.7 ¶2)

如果源是无符号的(或者有符号并且在 2 的补码算术中),这是一种说额外位被截断的奇特方式。

有许多不同的处理器和操作系统。unsigned long long几乎在所有内容上都是 64 位。unsigned long是另一回事。例如,Linux x86-64 上的 64 位,Linux x86-32 上的 32 位和 Windows x86-64 和 x86-32 上的 32 位。普通转换可能是无用的。

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

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

编译器将%更改为简单mov