固定宽度整数类型是否为标准内置类型的typedef?

时间:2015-06-24 21:51:44

标签: c++ language-lawyer

来自<cstdint>的类型(例如int16_tuint_fast64_tint_least8_t)是否保证为其中一个内置类型typedef shortunsigned long等?

或者是允许使用非常规内置类型来实现固定宽度类型的实现吗?

4 个答案:

答案 0 :(得分:3)

不,至少不适用于intN_t类型。这些类型保证有两个补码表示(根据C99 7.18.1.1,C ++ 11和C ++ 14参考)。标准整数类型不必是二进制补码。

C11对C99也有重大改变(实际上只是错误修正),强调了以上几点:

7.20.1.1/3:

  

但是,如果实现提供了整数类型   宽度为8,16,32或64位,无填充位,和(对于带符号类型)具有   二进制补码表示,它应定义相应的typedef名称。

答案 1 :(得分:2)

我面前有C99规范的草稿版本以及C ++ 14规范的草稿。由于这些都是草稿,这些信息可能不正确,但我认为最终版本中的措辞是相同的。

在C ++ 14规范中,§18.4.1对此有<cstdint>的说法:

namespace std {
   typedef signed-integer-type int8_t; // optional
   typedef signed-integer-type int16_t; // optional
   typedef signed-integer-type int32_t; // optional
   typedef signed-integer-type int64_t; // optional

   [ etc. ]
}

然后说

  

标题定义所有函数,类型和宏,与C标准中的7.18相同。

我参加了草案C99标准§7.18,并没有看到任何需要定义的类型实际上是内置类型的别名,如intlong int等。它只是说如果存在这些类型,则必须满足关于其范围,大小和内存布局的某些限制。

总的来说,我强烈怀疑答案是“不”,但如果我弄错了,我有兴趣看看我误读规格的地方。 : - )

希望这有帮助!

答案 2 :(得分:2)

这些是由C标准指定的(并且通过C ++标准引用并入),它要求每个都是带符号整数类型无符号整数类型,视具体情况而定。

有符号整数类型由核心语言定义为由标准有符号整数类型组成(signed charshort intintlong intlong long int)以及任何实现定义的扩展有符号整数类型

类似地,无符号整数类型由核心语言定义为由标准无符号整数类型组成(unsigned charunsigned short intunsigned intunsigned long intunsigned long long int)以及与扩展有符号整数类型对应的任何实现定义的扩展无符号整数类型

简而言之,每个typedef可能是通常的内置类型之一,也可能是实现定义的扩展整数类型。大多数编译器不支持扩展整数类型,因此在这些编译器上它们必须是内置类型。

答案 3 :(得分:1)

从C ++标准:“可能还有实现定义的扩展有符号整数类型。标准和扩展有符号整数类型统称为有符号整数类型。” (我认为有关扩展无符号整数类型的类似行)没有说明如何使用这些扩展整数类型,它们显然是不可移植的和实现定义的。

但是,int16_t等可以是扩展整数类型的typedef。