呈现128位长数据

时间:2017-03-11 18:52:31

标签: c unions largenumber

我需要表示一个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位类型,但我希望有更多可移植的实现。

感谢。

1 个答案:

答案 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__保护。