固定宽度整数类型是否保证是标准内置类型的 typedef?
Are the fixed width integer types guaranteed to be typedefs for the standard built in types?
来自 <cstdint>
的类型(例如 int16_t
、uint_fast64_t
、int_least8_t
)是否保证是 typedef
之一的内置类型short
、unsigned long
等类型?
或者是否允许实现使用非常用内置类型的类型来实现固定宽度类型?
来自 C++ 标准:"There may also be implementation-defined extended signed integer types. The standard and extended signed integer types are collectively called signed integer types. "。 (我认为有一条关于扩展无符号整数类型的类似行)没有说明如何使用这些扩展整数类型,它们显然不可移植且实现定义。
然而,int16_t 等可以是扩展整数类型的类型定义。
我面前有一份 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. ]
}
然后说
The header defines all functions, types, and macros the same as 7.18 in the C standard.
我查看了 C99 标准草案 §7.18,没有看到任何要求定义的类型实际上是 int
、long int
等内置类型的别名。它只是说如果这些类型存在,它们必须满足关于它们的范围、大小和内存布局的某些限制。
总的来说,我强烈怀疑答案是 "no,",但如果我弄错了,我很想知道我在哪里误读了规范。 :-)
希望对您有所帮助!
这些由 C 标准指定(并通过 C++ 标准引用),它要求每个都是 有符号整数类型 或 无符号整数类型,视情况而定。
有符号整数类型又由核心语言定义为由标准有符号整数类型组成(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 中的每一个都可能是常用的内置类型之一或实现定义的扩展整数类型。大多数编译器不支持扩展整数类型,因此在这些编译器上它们必须是内置类型。
不,至少对于类型 intN_t
不是。这些类型保证具有二进制补码表示(根据 C99 7.18.1.1,C++11 和 C++14 引用)。标准整数类型不必是二进制补码。
C11 相对于 C99 也有重要的变化(实际上只是 bugfix),强调以上几点:
7.20.1.1/3:
However, if an implementation provides integer types with
widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a
two’s complement representation, it shall define the corresponding typedef names.
来自 <cstdint>
的类型(例如 int16_t
、uint_fast64_t
、int_least8_t
)是否保证是 typedef
之一的内置类型short
、unsigned long
等类型?
或者是否允许实现使用非常用内置类型的类型来实现固定宽度类型?
来自 C++ 标准:"There may also be implementation-defined extended signed integer types. The standard and extended signed integer types are collectively called signed integer types. "。 (我认为有一条关于扩展无符号整数类型的类似行)没有说明如何使用这些扩展整数类型,它们显然不可移植且实现定义。
然而,int16_t 等可以是扩展整数类型的类型定义。
我面前有一份 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. ]
}
然后说
The header defines all functions, types, and macros the same as 7.18 in the C standard.
我查看了 C99 标准草案 §7.18,没有看到任何要求定义的类型实际上是 int
、long int
等内置类型的别名。它只是说如果这些类型存在,它们必须满足关于它们的范围、大小和内存布局的某些限制。
总的来说,我强烈怀疑答案是 "no,",但如果我弄错了,我很想知道我在哪里误读了规范。 :-)
希望对您有所帮助!
这些由 C 标准指定(并通过 C++ 标准引用),它要求每个都是 有符号整数类型 或 无符号整数类型,视情况而定。
有符号整数类型又由核心语言定义为由标准有符号整数类型组成(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 中的每一个都可能是常用的内置类型之一或实现定义的扩展整数类型。大多数编译器不支持扩展整数类型,因此在这些编译器上它们必须是内置类型。
不,至少对于类型 intN_t
不是。这些类型保证具有二进制补码表示(根据 C99 7.18.1.1,C++11 和 C++14 引用)。标准整数类型不必是二进制补码。
C11 相对于 C99 也有重要的变化(实际上只是 bugfix),强调以上几点:
7.20.1.1/3:
However, if an implementation provides integer types with widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a two’s complement representation, it shall define the corresponding typedef names.