基本类型
(另见 type 以了解类型系统概述,并见 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 相同的表示和对齐方式,但始终是不同的类型)。多字节字符字符串使用此类型表示代码单元。对于
[
0,
255]
范围内 unsigned char 类型的每个值,将该值转换为 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 扩展格式 是 x87 80 位扩展精度格式。许多 x86 和 x86-64 实现都使用它(一个值得注意的例外是 MSVC,它以与 double 相同的格式,即 binary64,实现 long double)。
- 在 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++ 除了通过 std::numeric_limits::has_signaling_NaN 检测到信令 NaN 的支持外,没有特别注意信令 NaN,并将所有 NaN 视为静默 NaN。
浮点数可以与算术运算符 +、-、/ 和 * 以及来自 <cmath> 的各种数学函数一起使用。内置运算符和库函数都可能引发浮点异常并设置 errno,如 math errhandling 中所述。
浮点表达式可能具有比其类型指示的更大的范围和精度,参见 FLT_EVAL_METHOD。浮点表达式也可能是收缩的,也就是说,计算时就好像所有中间值都具有无限的范围和精度,参见 #pragma STDC FP_CONTRACT。标准 C++ 不限制浮点运算的精度。
对浮点数的一些操作会受到浮点环境状态的影响并修改其状态(最值得注意的是,舍入方向)。
隐式转换在浮点类型和整型之间定义。
有关浮点类型的其他详细信息、限制和属性,请参见浮点类型的限制和 std::numeric_limits。
[编辑] 值域
下表提供了常用数值表示的限制参考。
在 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 起已不允许使用 8 位单码反码和符号-数值表示法(通过解决 CWG 问题 1759),因为在 UTF-8 字符串字面量 中使用的值为 0x80 的 UTF-8 代码单元必须可存储在 char 类型对象中。
浮点类型 T
的范围定义如下
- 最小保证范围是从
T
中可表示的最负有限浮点数到T
中可表示的最正有限浮点数。 - 如果负无穷大可在
T
中表示,则T
的范围将扩展到所有负实数。 - 如果正无穷大可在
T
中表示,则T
的范围将扩展到所有正实数。
由于负无穷大和正无穷大在 ISO/IEC/IEEE 60559 格式中是可表示的,因此所有实数都位于符合 ISO/IEC/IEEE 60559 的浮点类型可表示值的范围内。
类型 | 位大小 | 格式 | 值范围 | |
---|---|---|---|---|
近似值 | 精确值 | |||
字符 (character) | 8 | signed | −128 到 127 | |
unsigned | 0 到 255 | |||
16 | UTF-16 | 0 到 65535 | ||
32 | UTF-32 | 0 到 1114111 (0x10ffff) | ||
整数 (integer) | 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 | ||
二进制 (binary) 浮点 (floating-) 点 (point) |
32 | IEEE-754 |
|
|
64 | IEEE-754 |
|
| |
80[note 1] | x86 |
|
| |
128 | IEEE-754 |
|
|
- ↑ 对象表示通常在 32/64 位平台上分别占用 96/128 位。
注意:这些类型可表示的值的实际(与保证的最小值相反)限制可在 C 数值限制接口 和 std::numeric_limits 中找到。
[编辑] 数据模型
每个实现关于基本类型大小的选择统称为数据模型。四种数据模型被广泛接受
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)。
[编辑] 注释
特性测试 宏 | 值 | 标准 | 特性 |
---|---|---|---|
__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 数组) |
[编辑] 关键字
void, bool, true, false, char, char8_t, char16_t, char32_t, wchar_t, int, short, long, signed, unsigned, float, double
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 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 需要能够表示所有成员的不同代码 在支持的区域设置中指定的最大扩展字符集 |
不需要 |
[编辑] 参考文献
- 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]
[编辑] 另请参阅
C 文档 关于 算术类型
|