Fundamental types
(另请参阅 类型 以了解类型系统概述,以及 C++ 库提供的类型相关工具列表 )
以下类型统称为 fundamental types :
- (可能带有 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 扩展格式 是 x87 80位扩展精度格式 。该格式被许多 x86 和 x86-64 实现所采用(一个显著的例外是 MSVC,它将 long double 实现为与 double 相同的格式,即 binary64)。
- 在 PowerPC 上可采用 双倍精度算法 。
扩展浮点类型扩展浮点类型由实现定义。可能包含 固定宽度浮点类型 。 |
(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位有符号整数的最小保证范围是从
-(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 | |
| 无符号 | 0 至 255 | |||
| 16 | UTF-16 | 0 至 65535 | ||
| 32 | UTF-32 | 0 至 1114111 ( 0x10ffff ) | ||
| 整型 | 16 | 有符号 | ± 3.27 · 10 4 | −32768 至 32767 |
| 无符号 | 0 至 6.55 · 10 4 | 0 至 65535 | ||
| 32 | 有符号 | ± 2.14 · 10 9 | −2,147,483,648 至 2,147,483,647 | |
| 无符号 | 0 至 4.29 · 10 9 | 0 至 4,294,967,295 | ||
| 64 | 有符号 | ± 9.22 · 10 18 | −9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 | |
| 无符号 | 0 至 1.84 · 10 19 | 0 至 18,446,744,073,709,551,615 | ||
|
二进制
浮点型 |
32 | IEEE-754 |
|
|
| 64 | IEEE-754 |
|
|
|
| 80 [注 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系统中(例如 克雷公司上的UNICOS系统 )。
注释
| 特性测试 宏 | 值 | 标准 | 特性 |
|---|---|---|---|
__cpp_unicode_characters
|
200704L
|
(C++11) | 新字符类型 ( char16_t 和 char32_t ) |
__cpp_char8_t
|
201811L
|
(C++20) | char8_t |
202207L
|
(C++23) |
char8_t
兼容性与可移植性修复 (
允许从
(unsigned) char
数组初始化
来自
UTF-8 字符串字面量
)
|
关键词
void , bool , true , false , char , char8_t , char16_t , char32_t , wchar_t , int , short , long , signed , unsigned , float , double
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 问题报告 | 适用标准 | 已发布行为 | 正确行为 |
|---|---|---|---|
| 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 文档
关于
算术类型
|