C++ 对于标准内置类型,固定宽度整数类型是否保证为typedefs?

C++ 对于标准内置类型,固定宽度整数类型是否保证为typedefs?,c++,language-lawyer,C++,Language Lawyer,(如int16\u t、uint\u fast64\u t、int\u least8\u t)中的类型是否保证为typedef中的一种内置类型,如short、unsigned long等 或是允许使用非常规内置类型来实现C++中的固定宽度类型< p>的实现:“也可能有实现定义的扩展符号整数类型。标准扩展符号整数类型统称为有符号整数类型。”(我认为关于扩展无符号整数类型也有类似的说法)没有说明如何使用这些扩展整数类型,它们显然是不可移植的,并且是实现定义的 但是,int16_t等可以是扩展整数类型

(如
int16\u t
uint\u fast64\u t
int\u least8\u t
)中的类型是否保证为
typedef
中的一种内置类型,如
short
unsigned long

或是允许使用非常规内置类型来实现C++中的固定宽度类型

< p>的实现:“也可能有实现定义的扩展符号整数类型。标准扩展符号整数类型统称为有符号整数类型。”(我认为关于扩展无符号整数类型也有类似的说法)没有说明如何使用这些扩展整数类型,它们显然是不可移植的,并且是实现定义的


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

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

在C++14规范中,§18.4.1对
作了如下说明:

然后说

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

我查看了C99标准草案§7.18,没有看到任何要求定义的类型实际上是内置类型的别名的内容,如
int
long int
,等等。它只是说,如果这些类型存在,它们必须满足有关其范围、大小和内存布局的特定约束

总的来说,我强烈怀疑答案是“不”,但如果我弄错了,我想看看我在哪里误读了规范


希望这有帮助

< P>这些是由C标准指定的(并且由C++标准引用),它要求每个都是有符号整数类型或无符号整数类型的Type,如情况可能是这样。 有符号整数类型又由核心语言定义,由标准的有符号整数类型(即
有符号字符
短整数
整数
长整数
长整数
)和任何实现定义的扩展有符号整数类型组成

类似地,无符号整数类型由核心语言定义为由标准无符号整数类型组成(它们是
无符号字符
无符号短整型
无符号整型
无符号长整型
无符号长整型
)以及与扩展有符号整数类型对应的任何实现定义的扩展无符号整数类型


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

否,至少不支持类型
intN\t
。这些类型保证有两个补码表示(根据C++11和C++14引用的C99 7.18.1.1)。标准整数类型不必是2的补码

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

7.20.1.1/3:

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


扩展整数类型仍必须遵守整数类型的所有核心语言规则。这并不表示是否允许使用这些扩展类型来实现
@BaummitAugen中的类型。
中的类型必须是有符号或无符号整数类型,gnasher729的引号显示了标准如何定义“有符号整数类型”。显示“带符号整数类型”允许“扩展带符号整数类型”回答您的问题,不是吗?@hvd如果我们将您的评论(加上一些标准引号)和上述答案结合起来,我们可能会有一个答案。:)@我明白你的意思,答案可能会更清楚。如果gnasher729想将我的评论纳入答案中,我完全同意,最好再详细说明一点。:)但这并不能证明不使用二的补码的实现实际上可以提供这些可选类型(在C++中),不是吗?@BaummitAugen在任何情况下都不禁止实现提供这些可选类型,如果标准类型不是二的补码,
intN\t
类型肯定不会是标准类型的typedef。这似乎是这里最有力的证明,我希望它也是正确的(就我所知)。如果有语言律师来反驳你的回答,我明天再查。
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. ]
}