C++中如何将int64_t位域的低32位复制到char[4]数组中
实现方法
首先注意C++标准中位域的内存布局由编译器和平台决定,不可直接取位域的地址,需要先转存为普通整数变量再处理。
方式1:平台原生字节序拷贝
如果不需要固定字节序,只需要和当前系统内存存储的字节序一致,直接用memcpy即可:
// 先将位域值转存为uint32_t,自动截断得到低32位,转uint64_t避免带符号数的符号扩展问题 uint32_t low32_val = static_cast<uint32_t>(static_cast<uint64_t>(label)); // 拷贝到nol数组 std::memcpy(nol, &low32_val, 4);
以上代码需要引入头文件<cstring>。
方式2:固定字节序手动赋值
如果需要跨平台保持固定的字节存储顺序,直接按位拆分赋值,不受平台大小端影响:
- 若要求
nol[0]存低32位的最低字节、nol[3]存最高字节(小端序存储):
uint32_t low32_val = static_cast<uint32_t>(static_cast<uint64_t>(label)); nol[0] = static_cast<char>(low32_val & 0xFF); nol[1] = static_cast<char>((low32_val >> 8) & 0xFF); nol[2] = static_cast<char>((low32_val >> 16) & 0xFF); nol[3] = static_cast<char>((low32_val >> 24) & 0xFF);
- 若要求
nol[0]存低32位的最高字节、nol[3]存最低字节(大端序存储),调整位移顺序即可:
uint32_t low32_val = static_cast<uint32_t>(static_cast<uint64_t>(label)); nol[0] = static_cast<char>((low32_val >> 24) & 0xFF); nol[1] = static_cast<char>((low32_val >> 16) & 0xFF); nol[2] = static_cast<char>((low32_val >> 8) & 0xFF); nol[3] = static_cast<char>(low32_val & 0xFF);
注意事项
- 若确认
label存储的始终是正数,不需要处理符号扩展,可以省略转uint64_t的步骤,直接static_cast<uint32_t>(label)即可。 - 禁止直接对
label位域变量取地址,C++标准不支持取位域的地址,行为未定义。
内容的提问来源于stack exchange,提问作者MoranLev
相关产品推荐
相关产品推荐

