gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:31:20 24 4
gpt4 key购买 nike

这段代码怎么样

#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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com