如何在C++中将一个无符号的 int 转换为两个无符号的短裤?

How convert an unsigned int to two unsigned shorts in C++?

本文关键字:无符号 转换 两个 int 一个 C++      更新时间:2023-10-16

我最初有2 WORD(那是4个字节)。我已经将它们存储在unsigned int中.如何拆分它,以便在一个unsigned short变量中有 2(最左边)字节,在另一个unsigned short变量中有另外 2 个字节?

我希望我的问题清楚,否则请告诉我,我会添加更多详细信息! :)

示例:我将这个十六进制存储在无符号的 int:4f07aabb

我怎样才能把它变成两条未签名的短裤,让其中一条拿着4f07,另一条拿着aabb

如果您确定目标系统上unsigned int至少有 4 个字节(这不能保证!),您可以执行以下操作:

unsigned short one = static_cast<unsigned short>(original >> (2 * 8));
unsigned short two = static_cast<unsigned short>(original % (1 << (2 * 8)));

仅当原始值确实只包含一个 4 字节值(前面可能带有填充零)时,才能保证有效。如果你不喜欢位移,你也可以做

uint32_t original = 0x4f07aabb; // guarantee 32 bits
uint16_t parts[2];
std::memcpy(&parts[0], &original, sizeof(uint32_t));
unsigned short one = static_cast<unsigned short>(parts[0]);
unsigned short two = static_cast<unsigned short>(parts[1]);

这将根据目标系统的字节序产生两个值;在立端序架构上,结果是相反的。您可以检查即将到来的 C++20std::endian::native的字节序。