我正在尝试使用 C++ 结构实现 24 位整数数据类型。我希望它的大小为 24 位/3 字节——而不是填充到 4 字节 int 中。我正在使用 Visual Studio Community 2019 的编译器。
我尝试使用 #pragma pack 来防止这种情况,如下所示,但 sizeof( int24 ) 仍然返回 4。
#pragma pack(push, 1)
struct int24{
unsigned int data : 24;
};
#pragma pack(pop)
如何使结构体的大小为 3 个字节?如果可能的话,我想避免使用无符号字符数组。
#pragma pack
文档的理解,它仅与在结构中的成员之间添加填充字节有关。
为了实现您想要的目的,您可以使用一个包含 3 个字节的
std::array
的结构,并使用访问器将 uint32_t
值转换为它/从它转换:
#include <iostream>
#include <array>
struct int24 {
std::array<uint8_t,3> bytes;
explicit int24(uint32_t value)
{
set(value);
}
void set(uint32_t value)
{
bytes[0] = static_cast<uint8_t>(value & 0x000000ff);
bytes[1] = static_cast<uint8_t>((value & 0x0000ff00) >> 8);
bytes[2] = static_cast<uint8_t>((value & 0x00ff0000) >> 16);
}
unsigned int get()
{
uint32_t value = bytes[0] + (bytes[1] << 8) + (bytes[2] << 16);
return value;
}
};
int main()
{
std::cout << sizeof(int24) << std::endl;
int24 i24{ 12345 };
std::cout << i24.get();
}
输出:
3
12345