从64位整数中提取32位
extract 32bit from 64bit integer
我有一个uint64_t
整数,并通过以下代码将最后32位提取为uint32_t
数:
uint32_t getLast(uint64_t v){
uint64_t t= v >> 32;
return reinterpret_cast<uint32_t &>( t ); // type-punned pointer warning
}
int main()
{
uint64_t a = 1l << 33 | 1l << 3;
std::cout << getLast(a) << std::endl; // prints 2
}
这段代码给出了警告:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
return reinterpret_cast<uint32_t &>( t );
我想解决这个问题,但不是通过使用联合类型。
reinterprete_cast
给出未定义的行为,当访问数据(复制重新解释的东西到返回值)(我认为?)
另一个似乎有效的解决方案?
uint32_t getLast(uint64_t v){
return (v >> 32) // conversion from bitshifted 64bit to 32bit, but what is with overflow?
}
我有点困惑,关于reinterpret_cast的未定义行为?那么我应该如何使用reinterpret_cast
,我认为这个例子是典型的使用模式?第二种方法也安全吗?
你应该只是static_cast<uint32_t>
。
reinterpret_cast
几乎是专门用于高度危险和可能非法的指针强制转换。
相关文章:
- 将应用程序从32位移植到64位时出现问题
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 浮点数为 32 位和 64 位二进制表示形式
- C++易失性:保证 32 位访问?
- C++将 16 位值转换为 32 位值
- 如何在 64 位平台上计算 32 位哈希C++?
- C++中的24位到32位转换
- 在机器字大小等于 32 位的计算机上int64_t如何工作?
- uint32_t如何保证 32 位?
- 将代码从 32 位迁移到 64 位时出现问题 Visual Studio 2010
- 如何将32位字符与内联assembelyc++中的32位字符进行比较
- 一个32位版本的应用程序,建立在CentOS 6 x64上,当在较新的Linux上启动时,在"dl_itera
- x86 32位对Cuda的支持
- 如何在 c++ 中使用 FFT 从 32 位浮点数组中提取频率
- 将SSE转换为霓虹灯:如何打包然后提取32位结果
- 从64位整数中提取32位
- 读取并提取32位无符号整数的特定位数