我试图将unsigned long long转换为unsigned long.以下是正确的方法吗?
unsigned long removeExtraBits2(unsigned long long c) {
return (unsigned long) ((c << 32) >> 32);
}
Run Code Online (Sandbox Code Playgroud)
如果没有,你能提供一个有效的例子吗?
我的假设是,当向左移动,然后向右移动时,最左边的32位被设置为0.
谢谢!
编辑:转换的目的是摆脱额外的位,"高于"32位,有效地保持最右边的32位为无符号长.
只做一个"普通"强制转换((unsigned long)c或者,如果你喜欢冗长,static_cast<unsigned long>(c)或者甚至只是将unsigned long long源值分配给unsigned long目标变量),标准保证左边的额外位将被截断.
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n,其中n是用于表示无符号类型的位数).
(C++ 11,§4.72)
如果源是无符号的(或者是有符号且采用2的补码算法),则说明额外的位被截断是一种奇特的方式.