c++ - 将 uint32_t 与 uint64_t 连接和拆分的最佳方法

标签 c++

这段代码怎么样

#include <cstdio>
#include <cinttypes>
#include <type_traits>
#include <cstddef>
#include <iostream>

int main()
{
    uint64_t tsc = 0xdeaddeadc0dec0de;
    uint32_t MSB = *((uint32_t*)&tsc+1);
    uint32_t LSB = *((uint32_t*)&tsc);
    std::printf("low   %x high %x \n", LSB,MSB);
    uint64_t MLSB = 0;
    *((uint32_t*)&MLSB) = LSB;
    *((uint32_t*)&MLSB+1) = MSB;
    std::printf("highlow %lx \n", MLSB);
    uint64_t LMSB = 0;
    *((uint32_t*)&LMSB+1) = LSB;
    *((uint32_t*)&LMSB) = MSB;
    std::printf("lowhigh %lx \n", LMSB);
}

问题是这段代码会出什么问题? 它是否依赖于机器成为大端? 可能是。 所以对于 Little-endian LSB 和 MSB 位置会改变 或者您可以通过使用系统宏来使其自动执行,这些宏为您提供字节顺序来决定哪个是高位还是低位 最后,如果这段代码运行得更快并且值得这样做而不是移位和类型转换吗?

最佳答案

如果您认为必须在代码中处理字节序,那您完全是错误的。

uint64_t tsc = 0xdeaddeadc0dec0de;
uint32_t MSB = tsc >> 32;
uint32_t LSB = tsc;
uint64_t MLSB = LSB | (static_cast<uint64_t>(MSB)) << 32;
uint64_t LMSB = MSB | (static_cast<uint64_t>(LSB)) << 32;

这就是您所需要的。数字就是数字。他们没有字节顺序。数字表示具有字节顺序。不要处理表示,要处理数字。

有关详细信息,请阅读 The byte order fallacy .

关于c++ - 将 uint32_t 与 uint64_t 连接和拆分的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68889666/

相关文章:

c++ - 在 Linux 上部署 Qt 应用程序

c++ - 递归模板元编程

c++ - 在 MISRA C++ 2008 中,有人知道规则 5-0-3 中出现的特殊概念 Cvalue 表达式吗?

c++ - 如何找出成员函数属于哪个类

c++ - 来自构造函数和析构函数的纯虚拟调用

c++ - 如何在 QGraphicsScene 上绘制一个点(通过鼠标单击)?

c++ - 调用 C++ STL 容器的 value_type 的静态成员函数

c++ - 计算 unordered_map 中重新散列的次数

c++ - 为什么 std::result_of 将(不相关的)函数类型作为类型参数?

c++ - 此应用程序启动失败,因为它找不到或加载 Qt 平台插件 "xcb"