基本类型
(另请参见 类型 以获取类型系统概述和 C++ 库提供的与类型相关的工具列表)
以下类型统称为基本类型
- (可能为 cv 限定) void
|
(自 C++11 起) |
内容 |
[编辑] void
- void — 值集为空的类型。它是一个不完整类型,无法完成(因此,不允许使用类型为 void 的对象)。没有数组 为 void,也没有对 void 的引用。但是,指向 void 的指针 和返回类型为 void 的函数(在其他语言中称为过程)是被允许的。
std::nullptr_t
std::nullptr_t 是空指针字面量 sizeof(std::nullptr_t) 等于 sizeof(void*). |
(自 C++11 起) |
[编辑] 整型
[编辑] 标准整型
- int — 基本整型。如果使用下面列出的任何修饰符,则可以省略关键字 int。如果没有长度修饰符,则保证其宽度至少为 16 位。但是,在 32/64 位系统上,它几乎可以保证其宽度至少为 32 位(见下文)。
[编辑] 修饰符
修饰基本整型。可以以任何顺序混合。每个组中只能存在一个。
- 有符号性
- signed — 目标类型将具有有符号表示(如果省略,这是默认值)
- unsigned — 目标类型将具有无符号表示
- 大小
- short — 目标类型将针对空间进行优化,其宽度至少为 16 位。
- long — 目标类型将具有至少 32 位的宽度。
|
(自 C++11 起) |
注意:与所有类型说明符一样,任何顺序都是允许的:unsigned long long int 和 long int unsigned long 指的是同一类型。
[编辑] 属性
下表总结了所有可用的标准整数类型及其在各种常见数据模型中的属性
类型说明符 | 等效类型 | 按 数据模型 的位宽度 | ||||
---|---|---|---|---|---|---|
C++ 标准 | LP32 | ILP32 | LLP64 | LP64 | ||
signed char
|
signed char | 至少 8 |
8 | 8 | 8 | 8 |
unsigned char
|
unsigned char | |||||
short
|
short int | 至少 16 |
16 | 16 | 16 | 16 |
short int
| ||||||
signed short
| ||||||
signed short int
| ||||||
unsigned short
|
unsigned short int | |||||
unsigned short int
| ||||||
int
|
int | 至少 16 |
16 | 32 | 32 | 32 |
signed
| ||||||
signed int
| ||||||
unsigned
|
unsigned int | |||||
unsigned int
| ||||||
long
|
long int | 至少 32 |
32 | 32 | 32 | 64 |
long int
| ||||||
signed long
| ||||||
signed long int
| ||||||
unsigned long
|
unsigned long int | |||||
unsigned long int
| ||||||
long long
|
long long int (C++11) |
至少 64 |
64 | 64 | 64 | 64 |
long long int
| ||||||
signed long long
| ||||||
signed long long int
| ||||||
unsigned long long
|
unsigned long long int (C++11) | |||||
unsigned long long int
|
注意:有符号和无符号整数类型的整数算术定义不同。请参阅 算术运算符,特别是 整数溢出。
std::size_t 是 sizeof
运算符的结果的无符号整数类型,以及 sizeof...
运算符和 alignof
运算符(自 C++11 起).
扩展整数类型扩展整数类型是实现定义的。请注意,固定宽度整数类型 通常是标准整数类型的别名。 |
(自 C++11 起) |
[编辑] 布尔类型
[编辑] 字符类型
字符类型是用于字符表示的整数类型。
- signed char — 用于有符号字符表示的类型。
- unsigned char — 用于无符号字符表示的类型。也用于检查 对象表示(原始内存)。
- char — 用于字符表示的类型,它可以在目标系统上以最有效的方式进行处理(具有与 signed char 或 unsigned char 相同的表示和对齐,但始终是不同的类型)。多字节字符字符串 使用此类型来表示代码单元。对于 unsigned char 类型在范围
[
0,
255]
中的每个值,将该值转换为 char 然后转换回 unsigned char 会生成原始值。(自 C++11 起) char 的符号性取决于编译器和目标平台:ARM 和 PowerPC 的默认值通常是无符号的,x86 和 x64 的默认值通常是有符号的。 - wchar_t — 用于宽字符表示的类型(请参阅 宽字符串)。它具有与其中一个整数类型相同的大小、符号性和对齐方式,但它是一个不同的类型。在实践中,它在 Linux 和许多其他非 Windows 系统上是 32 位并保存 UTF-32,但在 Windows 上是 16 位并保存 UTF-16 代码单元。该标准过去要求 wchar_t 足够大以表示任何支持的字符代码点。但是,此类要求无法在 Windows 上实现,因此它被视为一个 缺陷 并被删除。
|
(自 C++11 起) |
|
(自 C++20 起) |
除了最小的位数,C++ 标准还保证
- 1 == sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long).
注意:这允许 字节 大小为 64 位的极端情况,所有类型(包括 char)的宽度均为 64 位,并且 sizeof
对每种类型都返回 1。
[编辑] 浮点类型
[编辑] 标准浮点类型
以下三种类型及其 cv 限定版本统称为标准浮点类型。
- float — 单精度浮点类型。通常为 IEEE-754 binary32 格式。
- double — 双精度浮点类型。通常为 IEEE-754 binary64 格式。
- long double — 扩展精度浮点类型。不一定映射到 IEEE-754 规定的类型。
- IEEE-754 binary128 格式 由一些 HP-UX、SPARC、MIPS、ARM64 和 z/OS 实现使用。
- 最著名的 IEEE-754 binary64-extended 格式 是 x87 80 位扩展精度格式。它被许多 x86 和 x86-64 实现使用(一个值得注意的例外是 MSVC,它以与 double 相同的格式实现 long double,即 binary64)。
- 在 PowerPC 上,可以使用 double-double。
扩展浮点类型扩展浮点类型是实现定义的。它们可能包括 固定宽度浮点类型。 |
(自 C++23 起) |
[编辑] 属性
浮点类型可以支持 特殊值
- 无穷大(正负),请参阅 INFINITY
- 负零,-0.0。它与正零相等,但在某些算术运算中具有意义,例如 1.0 / 0.0 == INFINITY,但 1.0 / -0.0 == -INFINITY),以及一些数学函数,例如 sqrt(std::complex)
- 非数字 (NaN),它不与任何东西(包括它自己)进行比较相等。多个位模式代表 NaN,请参阅 std::nan,NAN。请注意,C++ 不会对信号 NaN 进行特殊处理,除了通过 std::numeric_limits::has_signaling_NaN 检测它们的支撑,并将所有 NaN 视为静默。
浮点数可以与 算术运算符 +,-,/ 和 * 以及 <cmath> 中的各种数学函数一起使用。内置运算符和库函数都可能引发浮点异常并设置 errno,如 math errhandling 中所述。
浮点表达式可能具有比其类型指示的更大的范围和精度,请参阅 FLT_EVAL_METHOD。浮点表达式也可能被压缩,即,计算就好像所有中间值具有无限的范围和精度一样,请参阅 #pragma STDC FP_CONTRACT。标准 C++ 不限制浮点运算的精度。
浮点数上的某些运算会受到 浮点环境(最显著的是舍入方向)的状态的影响并修改其状态。
隐式转换 在浮点类型和整数类型之间定义。
有关浮点类型的更多详细信息、限制和属性,请参阅 浮点类型的限制 和 std::numeric_limits。
[edit] 值的范围
下表提供了对常见数值表示限制的参考。
在 C++20 之前,C++ 标准允许任何带符号整数表示,而 N 位带符号整数的最小保证范围是从 -(2N-1
-1) 到 +2N-1
-1(例如,对于 8 位带符号类型,−127 到 127),这对应于 一补码 或 符号和幅度 的限制。
但是,所有 C++ 编译器都使用 二补码 表示,从 C++20 开始,它是标准允许的唯一表示,保证范围从 -2N-1
到 +2N-1
-1(例如,对于 8 位带符号类型,−128 到 127)。
从 C++11 开始(通过解决 CWG 问题 1759),不允许 8 位一补码和符号和幅度表示用于 char,因为在 UTF-8 字符串文字 中使用的值为 0x80 的 UTF-8 代码单元必须存储在 char 类型对象中。
浮点类型 T
的范围定义如下
- 最小保证范围是
T
中通过T
中可表示的最大正有限浮点数可表示的最负有限浮点数。 - 如果负无穷大在
T
中可表示,则T
的范围扩展到所有负实数。 - 如果正无穷大在
T
中可表示,则T
的范围扩展到所有正实数。
由于负无穷大和正无穷大在 ISO/IEC/IEEE 60559 格式中可表示,因此所有实数都位于符合 ISO/IEC/IEEE 60559 的浮点类型的可表示值的范围内。
类型 | 以位为单位的大小 | 格式 | 值范围 | |
---|---|---|---|---|
近似 | 精确 | |||
字符 | 8 | signed | −128 到 127 | |
unsigned | 0 到 255 | |||
16 | UTF-16 | 0 到 65535 | ||
32 | UTF-32 | 0 到 1114111 (0x10ffff) | ||
整数 | 16 | signed | ± 3.27 · 104 | −32768 到 32767 |
unsigned | 0 到 6.55 · 104 | 0 到 65535 | ||
32 | signed | ± 2.14 · 109 | −2,147,483,648 到 2,147,483,647 | |
unsigned | 0 到 4.29 · 109 | 0 到 4,294,967,295 | ||
64 | signed | ± 9.22 · 1018 | −9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | |
unsigned | 0 到 1.84 · 1019 | 0 到 18,446,744,073,709,551,615 | ||
二进制 浮动 点 |
32 | IEEE-754 |
|
|
64 | IEEE-754 |
|
| |
80[note 1] | x86 |
|
| |
128 | IEEE-754 |
|
|
- ↑ 对象表示通常在 32/64 位平台上分别占用 96/128 位。
注意:这些类型可表示的实际(与保证的最小值相反)限制可在 C 数字限制接口 和 std::numeric_limits 中找到。
[edit] 数据模型
每个实现对基本类型大小的选择统称为数据模型。四种数据模型被广泛接受
32 位系统
- LP32 或 2/4/4 (int 为 16 位,long 和指针为 32 位)
- Win16 API
- ILP32 或 4/4/4 (int,long 和指针为 32 位);
- Win32 API
- Unix 和类 Unix 系统(Linux,macOS)
64 位系统
- LLP64 或 4/4/8 (int 和 long 为 32 位,指针为 64 位)
- LP64 或 4/8/8 (int 为 32 位,long 和指针为 64 位)
- Unix 和类 Unix 系统(Linux,macOS)
其他模型非常罕见。例如,ILP64 (8/8/8: int,long 和指针为 64 位) 只出现在一些早期 64 位 Unix 系统中(例如,Cray 上的 UNICOS)。
[edit] 注释
特性测试 宏 | 值 | 标准 | 特性 |
---|---|---|---|
__cpp_unicode_characters |
200704L | (C++11) | 新的字符类型 (char16_t 和 char32_t) |
__cpp_char8_t |
201811L | (C++20) | char8_t |
202207L | (C++23) | char8_t 兼容性和可移植性修复 (允许从 UTF-8 字符串文字 初始化 (unsigned) char 数组) |
[edit] 关键字
void,bool,true,false,char,char8_t,char16_t,char32_t,wchar_t,int,short,long,signed,unsigned,float,double
[edit] 缺陷报告
以下行为更改缺陷报告被追溯应用于以前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
CWG 238 | C++98 | 对浮点实现施加的约束未指定 | 指定为 无约束 |
CWG 1759 | C++11 | char 不保证能够表示 UTF-8 代码单元 0x80 | 保证 |
CWG 2689 | C++11 | cv 限定的 std::nullptr_t 不是基本类型 | 它是 |
CWG 2723 | C++98 | 浮点类型的可表示值范围未指定 | 指定 |
P2460R2 | C++98 | wchar_t 要求能够为所有成员表示不同的代码 在受支持的语言环境中指定的最大扩展字符集 |
不要求 |
[edit] 参考文献
- C++23 标准 (ISO/IEC 14882:2024)
- 6.8.2 基本类型 [basic.fundamental]
- C++20 标准 (ISO/IEC 14882:2020)
- 6.8.1 基本类型 [basic.fundamental]
- C++17 标准 (ISO/IEC 14882:2017)
- 6.9.1 基本类型 [basic.fundamental]
- C++14 标准 (ISO/IEC 14882:2014)
- 3.9.1 基本类型 [basic.fundamental]
- C++11 标准 (ISO/IEC 14882:2011)
- 3.9.1 基本类型 [basic.fundamental]
- C++03 标准 (ISO/IEC 14882:2003)
- 3.9.1 基本类型 [basic.fundamental]
- C++98 标准 (ISO/IEC 14882:1998)
- 3.9.1 基本类型 [basic.fundamental]
[edit] 另请参阅
C 文档 关于 算术类型
|