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

8
<cstdint>中的类型(如int16_tuint_fast64_tint_least8_t)是否保证是内置类型之一(如shortunsigned long等)的typedef
还是实现可以使用非通常的内置类型来实现固定宽度类型?
4个回答

4
不,至少对于类型intN_t是这样的。根据C99 7.18.1.1(C++11和C++14参考),这些类型保证具有二进制补码表示法。标准整数类型不必是二进制补码。
C11对C99也有重要的更改(实际上只是错误修复),强调了上述观点:
7.20.1.1/3:
“然而,如果一个实现提供了8、16、32或64位宽度的整数类型,没有填充位,并且(对于有符号类型)具有二进制补码表示,则应定义相应的typedef名称。”

但这并不证明在C++中,不使用二进制补码的实现实际上允许提供那些可选类型,是吗? - Baum mit Augen
2
@BaummitAugen 实现在任何情况下都不禁止提供这些可选类型,而且在标准类型不是二进制补码的情况下,intN_t 类型一定不会是标准类型的 typedef。 - Anton Savin

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,并没有要求所定义的类型实际上必须是内置类型的别名,比如int、long int等。它只是说,如果这些类型存在,则必须满足某些关于它们的范围、大小和内存布局的限制。
总的来说,我强烈怀疑答案是否定的,但如果我错了,我很想知道我在规范中哪里理解错了。 :-)
希望这可以帮到您!

这似乎是最有力的证据,我希望它也是正确的(就我所知)。如果有语言专家来反驳你的答案,我明天会再次检查。 - Baum mit Augen

2
这些类型由C标准(并被C++标准所引用)规定,要求每个类型都是有符号整型或无符号整型的typedef。

“有符号整型”由核心语言定义,包括“标准有符号整型”(即signed char、short int、int、long int和long long int)以及任何实现定义的“扩展有符号整型”。

同样,“无符号整型”由核心语言定义,包括“标准无符号整型”(即unsigned char、unsigned short int、unsigned int、unsigned long int和unsigned long long int)以及与扩展有符号整型相对应的任何实现定义的“扩展无符号整型”。

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


1
从C++标准中可以看到:“还可能有实现定义的扩展有符号整数类型。标准和扩展的有符号整数类型统称为有符号整数类型。”(我认为关于扩展无符号整数类型也有类似的说明)没有说明如何使用这些扩展整数类型,它们显然是非便携式和实现定义的。
然而,int16_t等可以是扩展整数类型的typedef。

扩展整数类型仍必须遵守整数类型的所有核心语言规则。 - T.C.
这并没有说明是否允许使用这些扩展类型来实现<cstdint>中的类型。 - Baum mit Augen
@BaummitAugen 是的。<cstdint> 中的类型必须是有符号或无符号整数类型,gnasher729 的引用显示了标准如何定义“有符号整数类型”。展示“有符号整数类型”允许“扩展有符号整数类型”回答了你的问题,不是吗? - user743382
@hvd,如果我们结合您的评论(加上一些标准引用)和上面的回答,或许就能得出答案了。 :) - Baum mit Augen
@BaummitAugen 我理解你的观点,答案可能需要更加清晰明了。如果 gnasher729 愿意将我的评论并入回答中,并且最好能够再详细阐述一些,我完全没有问题。 :) - user743382

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接