我需要表示一个128位无符号整数,并将其传递给具有原型int lib_api(unsigned char *data, size_t len)
的API。我有以下几点:
union {
unsigned char u8[16];
uint16_t u16[8];
uint32_t u32[4];
};
或
struct {
uint64_t hi;
uint64_t lo;
};
哪种选择更容易使用和实施?我知道gcc特定的128位类型,但我希望有更多可移植的实现。
感谢。
答案 0 :(得分:1)
这两个选项的主要问题是字节顺序。
如果你知道平台的字节顺序,你可以按照自己喜欢的方式实现它。请注意,您编写的代码因此是不可移植的,因此您应采取相应的预防措施,以确保它在具有正确字节序的平台中运行。
另一个陷阱涉及unsigned char
的大小。在大多数情况下,这到处都是8位。但它不是必需,这可能会导致问题。但是,由于此代码可能适用于特定平台,因此您可以轻松检查该代码。
最终结果是您有两种可能的解决方案。您可以找到的最便携的解决方案如下:
struct int128 {
unsigned char values[16];
};
...但最实用的解决方案看起来像这样:
union int128 {
unsigned char u8[16];
uint16_t u16[8];
uint32_t u32[4];
uint64_t u64[2];
struct {
// anonymous struct, also assuming big-endian given your example
uint64_t hi;
uint64_t lo;
};
};
您想要使用的任何一个将取决于您的具体项目。
编辑:如果您有特定于gcc的128位类型,您也可以将它们添加到联合中,受#ifdef __GNUC__
保护。