我正在尝试将unsigned long long转换为unsigned long。以下是正确的方法吗?
unsigned long removeExtraBits2(unsigned long long c) {
return (unsigned long) ((c << 32) >> 32);
}
如果没有,你能提供一个有效的例子吗?
我的假设是,当向左移动,然后向右移动时,最左边的32位被设置为0.
谢谢!
编辑:转换的目的是去除额外的位,“高于”32位,实际上只保留最右边的32位为无符号长。
答案 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
。