【发布时间】:2015-06-24 21:51:44
【问题描述】:
对于short、unsigned long 等内置类型之一,来自<cstdint> 的类型(例如int16_t、uint_fast64_t、int_least8_t)是否保证为typedefs?
或者是否允许使用非通常内置类型的类型来实现固定宽度类型?
【问题讨论】:
标签: c++ language-lawyer
对于short、unsigned long 等内置类型之一,来自<cstdint> 的类型(例如int16_t、uint_fast64_t、int_least8_t)是否保证为typedefs?
或者是否允许使用非通常内置类型的类型来实现固定宽度类型?
【问题讨论】:
标签: c++ language-lawyer
不,至少对于 intN_t 类型不是。这些类型保证具有二进制补码表示(根据 C++11 和 C++14 引用的 C99 7.18.1.1)。并且标准整数类型不必是二进制补码。
C11 相对于 C99 也有重要的变化(实际上只是错误修复),强调了上面的一点:
7.20.1.1/3:
但是,如果实现提供整数类型 宽度为 8、16、32 或 64 位,无填充位,和(对于有符号类型)具有 二进制补码表示,它应该定义相应的typedef名称。
【讨论】:
intN_t 类型肯定不会是标准类型的 typedef。
这些由 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) 以及与扩展有符号整数类型相对应的任何实现定义的扩展无符号整数类型。
简而言之,这些类型定义中的每一个都可能是通常的内置类型之一或实现定义的扩展整数类型。大多数编译器不支持扩展整数类型,因此在那些编译器上它们必须是内置类型。
【讨论】:
我面前有一份 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 等)的别名。它只是说如果这些类型存在,它们必须满足关于其范围、大小和内存布局的某些限制。
总的来说,我强烈怀疑答案是否定的,但如果我弄错了,我很想看看我在哪里误读了规范。 :-)
希望这会有所帮助!
【讨论】:
来自 C++ 标准:“也可能存在实现定义的扩展有符号整数类型。标准和扩展有符号整数类型统称为有符号整数类型。”。 (我认为关于扩展的无符号整数类型也有类似的说法)没有说明您将如何使用这些扩展的整数类型,它们显然是不可移植的并且实现定义。
但是,int16_t 等可以是扩展整数类型的 typedef。
【讨论】:
<cstdint>中的类型。
<cstdint> 中的类型要求是有符号或无符号整数类型,gnasher729 的引用显示了标准如何定义“有符号整数类型”。显示“有符号整数类型”允许“扩展有符号整数类型”回答了您的问题,不是吗?