C 显示128位长的数据

C 显示128位长的数据,c,unions,largenumber,C,Unions,Largenumber,我需要表示一个128位无符号整数,并将其传递给具有原型int lib_apiunsigned char*data,size_t len的API。我有以下想法: union { unsigned char u8[16]; uint16_t u16[8]; uint32_t u32[4]; }; 或 什么选项更易于使用和实施?我知道有特定于gcc的128位类型,但我希望有更多的可移植实现 谢谢。这两种选择的主要问题都是持久性 如果您知道平台的终结性,您可以用任何方式实现它。请注意,您编

我需要表示一个128位无符号整数,并将其传递给具有原型int lib_apiunsigned char*data,size_t len的API。我有以下想法:

union {
  unsigned char u8[16];
  uint16_t u16[8];
  uint32_t u32[4];
};

什么选项更易于使用和实施?我知道有特定于gcc的128位类型,但我希望有更多的可移植实现


谢谢。

这两种选择的主要问题都是持久性

如果您知道平台的终结性,您可以用任何方式实现它。请注意,您编写的代码因此是不可移植的,因此您应该采取相应的预防措施,以确保它在具有正确endianness的平台上运行

另一个陷阱与未签名字符的大小有关。在大多数情况下,这是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;
  };
};
…但最实际的解决方案往往是这样的:

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 ____保护。

谢谢您的评论。将无符号字符值[16]放入结构中有什么好处?@Mark数组通过引用传递,结构通过值传递。如果类型表示一个整数,则通常需要按值传递它-使用结构可以提供这种可能性,同时仍然可以轻松地传递指针。