Fundamental types
(另见 类型 查看类型系统概述,以及 C++标准库提供的类型相关工具列表 )
以下类型统称为 基础类型 :
- (可能带有 cv 限定符) void
|
(since 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位。
|
|
(since 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 起)
。
扩展整数类型扩展整数类型由实现定义。注意 固定宽度整数类型 通常是标准整数类型的别名。 |
(since 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 起) |
|
|
(since 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,它将 long double 实现为与 double 相同的格式,即binary64)。
- 在PowerPC上可以使用 双倍精度 。
扩展浮点类型扩展浮点类型由实现定义。它们可能包括 固定宽度浮点类型 。 |
(since 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。
浮点数可以与 算术运算符 + 、 - 、 / 和 * 以及 <cmath> 中的各种数学函数一起使用。内置运算符和库函数都可能引发浮点异常并设置 errno ,如 math errhandling 中所述。
浮点表达式的范围和精度可能比其类型指示的更大,参见 FLT_EVAL_METHOD 。浮点表达式也可能被 收缩 ,即计算时仿佛所有中间值具有无限范围和精度,参见 #pragma STDC FP_CONTRACT 。标准C++不限制浮点运算的精度。
某些浮点数的操作受 浮点环境 状态的影响并修改该状态(最显著的是舍入方向)。
在浮点类型和整数类型之间定义了 隐式转换 。
有关浮点类型的其他详细信息、限制和属性,请参见 浮点类型限制 和 std::numeric_limits 。
值范围
下表提供了常见数值表示范围的参考。
在C++20之前,C++标准允许任何有符号整数表示,且N位有符号整数的最小保证范围是从
-(2
N-1
-1)
到
+2
N-1
-1
(例如,对于8位有符号类型为
−127
到
127
),这对应于
反码
或
符号幅度
的限制。
然而,所有C++编译器都使用
补码
表示,并且从C++20开始,这是标准唯一允许的表示,保证范围从
-2
N-1
到
+2
N-1
-1
(例如,对于8位有符号类型为
−128
到
127
)。
自C++11起(通过 CWG问题1759 的解决), char 的8位反码和符号幅度表示已被禁止,因为用于 UTF-8字符串字面量 的值0x80的UTF-8代码单元必须可存储在 char 类型对象中。
浮点类型
T
的范围定义如下:
-
最小保证范围是
T中可表示的最负有限浮点数到T中可表示的最正有限浮点数。 -
如果负无穷大在
T中可表示,则T的范围扩展到所有负实数。 -
如果正无穷大在
T中可表示,则T的范围扩展到所有正实数。
由于负无穷大和正无穷大在 ISO/IEC/IEEE 60559 格式中可表示,所有实数都位于遵循ISO/IEC/IEEE 60559的浮点类型的可表示值范围内。
| 类型 | 位大小 | 格式 | 值范围 | |
|---|---|---|---|---|
| 近似值 | 精确值 | |||
| 字符 | 8 | 有符号 | −128 到 127 | |