固定宽度整数类型是否保证是标准内置类型的typedefs



对于shortunsigned long等内置类型之一,来自<cstdint>的类型(如int16_tuint_fast64_tint_least8_t)是否保证为typedefs。?

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

没有,至少对于类型intN_t没有。这些类型保证具有二的补码表示(根据C++11和C++14参考的C99 7.18.1.1)。标准整数类型不必是二的补码。

C11与C99相比也有重要的变化(实际上只是错误修复),强调了上面的一点:

7.20.1.1/3:

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

这些由C标准指定(并由C++标准通过引用合并),该标准要求每个都是有符号整数类型无符号整数类型的typedef,视情况而定。

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

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

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

我面前有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等)的别名的内容。它只是说,如果这些类型存在,它们必须满足关于其范围、大小和内存布局的某些限制。

总的来说,我强烈怀疑答案是"不",但如果我错了,我很想看看我在哪里误读了规范:-)

希望这能有所帮助!

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

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

最新更新