c - 显示128位长数据

标签 c unions largenumber

我需要表示一个 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/

相关文章:

c++ - 是否保证 union 与 boost::hana::Structure 一起工作?

c - 使用指向存储在结构 C 中的数组的指针访问数组

c - 命名匿名文件指针

c++ - 联盟初始化

c - 在 C 中实现 COBOL REDEFINES

python - 在 Python 中格式化大整数

java - 处理非常大的数字

Java:无法处理大量数据(Euler 项目:#1)

c - 为什么此代码会阻止 gcc 和 llvm 进行尾调用优化?

c++ - 从在 postgresql 上运行的 C++ 文件打印