uint128_t 没有命名类型

新手上路,请多包涵

我正在将一些代码从 C 移植到 C++。在转换过程中我遇到:

uint128_t 没有命名类型

我的编译器:gcc 版本 5.2.1

我的操作系统:Ubuntu 15.1

这编译得很好,我认为它可以通过包含 stdint.h 来解决,但它没有。到目前为止,我还没有尝试任何其他方法,因为似乎没有很多关于此错误的信息( 示例)。 uint128_t 在整个程序中使用并且对于构建至关重要,因此我无法删除它,并且我不确定是否使用不同的整数类型。

以下是使用地点和方式的示例。

 union {
    uint16_t  u16;
    uint32_t  u32;
    uint128_t u128;
} value;

定义一个 uint128_t 或者我应该看看我的编译器是否可以?

原文由 Zimano 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.7k
2 个回答

GCC has builtin support for the types __int128 , unsigned __int128 , __int128_t and __uint128_t (the last two are undocumented).使用它们来定义您自己的类型:

 typedef __int128 int128_t;
typedef unsigned __int128 uint128_t;


或者,您可以使用 __mode__(TI)

 typedef int int128_t __attribute__((mode(TI)));
typedef unsigned int uint128_t __attribute__((mode(TI)));

引用 文档

TImode

“Tetra Integer” (?) 模式表示一个十六字节的整数。

十六字节 = 16 * CHAR_BIT >= 128。

原文由 Andrea Corbellini 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为这可以通过包含 stdint.h 来解决,但事实并非如此。

好吧,它可能不会。

首先检查 C++ 头文件, cstdint ,来自 C++14,第 18.4.1 章,

 namespace std {.....

typedef unsigned integer type uint8_t; // optional
typedef unsigned integer type uint16_t; // optional
typedef unsigned integer type uint32_t; // optional
typedef unsigned integer type uint64_t; // optional
.....

和,

头文件定义了与 C 标准中的 7.18 相同的所有函数、类型和宏。 [..]

然后引用 C11 标准,第 7.20.1.1 章( _强调我的_)

  1. typedef 名称 uintN_t 指定宽度为 N 且没有填充位的无符号整数类型。因此, uint24_t 表示这样一个无符号整数类型,其宽度正好是 24 位。

  2. 这些类型是可选的。但是,如果实现提供了宽度为 8、16、32 或 64 位的整数类型,没有填充位,并且(对于有符号类型)具有二进制补码表示,则它应定义相应的 typedef 名称。

所以,在这里我们注意到两件事。

  1. 不强制实施为固定宽度的 int s 提供支持。

  2. 正如我们所见,标准将宽度限制为 64 。标准中再次没有规定宽度大于该宽度。您需要查看使用环境的文档。

原文由 Sourav Ghosh 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题