【问题标题】:uint128_t does not name a typeuint128_t 没有命名类型
【发布时间】:2016-04-07 22:02:03
【问题描述】:

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

uint128_t 没有命名类型

我的编译器:gcc 版本 5.2.1
我的操作系统:Ubuntu 15.1

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

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

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

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

【问题讨论】:

  • 太宽泛了。 128 位类型是非标准的。甚至 uint32_t 也不受 C 标准的保证。
  • 我认为standard suggests fixed-width integer types 仅支持 64 位,而不是更多。您应该找到一个为更广泛的类型提供软件支持的编译器,或者找到一个 bignum 库或自己编写。
  • @legends2k:固定宽度类型是可选的。只有某些(即n*8; n=1..8leastfast 类型是强制性的。
  • 我相信 g++ 不会定义 uint128_t,因为这需要对 std::uintmax_t 进行 ABI 重大更改。
  • gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html typdef __int128 uint128_t,编译器应该知道你的目标是否支持它。

标签: c++ c types integer


【解决方案1】:

GCC 内置了对 __int128, unsigned __int128__int128_t__uint128_t 类型的支持(最后两个未记录)。使用它们来定义您自己的类型:

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)));

引用documentation

TImode

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

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

【讨论】:

  • 或者重述@AndreaCorbellini 所说的有点不同:128 位整数类型是 GNU 编译器特有的功能。 (1.) 如果你想保持你的代码可移植,你将不得不创建自动检测这些编译器特性的头文件。 (2.) 设置/获取值会起作用,但在使用算术运算/函数时您的里程可能会有所不同(更不用说所有类型转换问题)。
【解决方案2】:

我认为这可以通过包含 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. 不强制要求实现支持固定宽度的ints。

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

【讨论】:

  • 我明白了,但是有没有办法定义一个 128 位的整数?
  • 问题是关于移植到 C++,所以引用 C++ 标准可能会更有帮助。指出原始代码使用可选结构更适合作为命令而不是作为答案。
  • @KlasLindbäck 现在怎么样?
  • 不同意标准限制宽度最大为64
  • @chux 我明白你的意思。我应该写“标准定义的宽度限制为 64 字节......”。会有什么好处吗?
【解决方案3】:

正如其他答案所指出的,C++ 标准不需要 128 位整数可用,也不需要 typedefed 为 uint128_t 即使存在。如果您的编译器/架构不支持 128 位整数并且您需要它们,您可以使用 boost 来模拟它们:

http://www.boost.org/doc/libs/1_58_0/libs/multiprecision/doc/html/boost_multiprecision/tut/ints/cpp_int.html

我认为 boost 库会自动使用原生类型(如果可用)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2023-04-07
    • 2021-02-03
    • 2017-04-01
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多