我需要表示一个 128 位无符号整数,并将其传递给具有原型(prototype) 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 位类型,但我想要更可移植的实现。
谢谢。
最佳答案
这两个选项的主要问题是字节顺序。
如果您知道平台的字节顺序,则可以按照您喜欢的方式实现它。请注意,您编写的代码因此是不可移植的,因此您应该采取相应的预防措施,以确保它在具有正确字节顺序的平台上运行。
另一个陷阱涉及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 位类型可用,您也可以随时将它们添加到 union 中,并受 #ifdef __GNUC__
保护。
关于c - 显示128位长数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42739226/