基础类型
(类型系统概览见类型,以及参阅 C++ 库提供的类型相关的工具列表)
目录 |
[编辑] void 类型
- void - 值为空集的类型。它是无法完成的不完整类型(从而不允许
void类型对象)。无void的数组,亦无到void的引用。然而容许指向void的指针和返回void类型的函数(其他语言中的过程)。
[编辑] std::nullptr_t
| 定义于头文件 <cstddef>
|
||
| typedef decltype(nullptr) nullptr_t; |
(C++11 起) | |
std::nullptr_t 是空指针字面量 nullptr 的类型。它是独立类型,既非指针类型,亦非指向成员指针类型。
[编辑] 布尔类型
[编辑] 字符类型
- signed char - 表示有符号字符的类型。
- unsigned char - 表示无符号字符的类型。亦用于审查对象表示(无修饰内存)。
- char - 表示能在目标系统上最有效地处理的字符的类型(拥有与 signed char 或 unsigned char 之一相同的表示和对齐,但始终是独立的类型)。多字节字符串用此类型表示编码单元。字符类型大到足够表示任何 UTF-8 编码单元。 (C++14 起) char 的符号性取决于编译器和目标平台: ARM 和 PowerPC 的默认设置常为无符号,而 x86 与 x64 的默认设置常为有符号。
- wchar_t - 表示宽字符的类型(见宽字符串)。要求大到足以表示任何受支持的编码位(支持 Unicode 的系统上为 32 位。值得注意的例外是 Windows ,其中 wchar_t 为 16 位并保有 UTF-16 编码单元)。它拥有与整数类型之一相同的大小、符号性和对齐,但它是独立的类型。
|
(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 | ||
| 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
| ||||||
在最小位数外, C++ 标准还保证
- 1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) 。
注意:这允许极端情况,其中字节有 64 位大小,所有类型(包括 char )有 64 位宽,而 sizeof 对每个类型返回 1 。
注意:整数算术对有符号和无符号整数类型定义有别。见算术运算符,特别是整数溢出。
[编辑] 数据模型
每个实现关于基础类型大小所做的选择被统称为数据模型。有四个数据模型广为接受:
32 位系统:
- LP32 或 2/4/4 ( int 为 16 位, long 和指针为 32 位)
- Win16 API
- ILP32 或 4/4/4 ( int 、 long 和指针为 32 位)
- Win32 API
- Unix 和类 Unix 系统( Linux 、 Mac OS X )
64 位系统:
- LLP64 或 4/4/8 ( int 和 long 为 32 位,指针为 64 位)
- Win64 API
- LP64 或 4/8/8 ( int 为 32 位, long 和指针为 64 位)
- Unix 和类 Unix 系统( Linux 、 Mac OS X )
其他数据模型很罕见。例如, ILP64 ( 8/8/8 : int 、 long 和指针为 64 位)只出现于某些早期 64 位 Unix 系统(例如 Unicos on Cray )。
[编辑] 浮点类型
- float - 单精度浮点类型。通常为 IEEE-754 32 位浮点类型
- double - 双精度浮点类型。通常为 IEEE-754 64 位浮点类型
- long double - 扩展精度浮点类型。不必映射到 IEEE-754 所强制的类型。在 x86 和 x86-64 架构上通常为 80 位 x87 浮点类型。
[编辑] 属性
浮点类型可支持特殊值:
- 无穷大(正和负),见 INFINITY
- 负零, -0.0 。它与正零比较相等,但在某些算术运算中有意义,例如 1.0/0.0 == INFINITY ,但 1.0/-0.0 == -INFINITY) ,而且对某些数学函数有意义,例如 sqrt(std::complex)
- 非数 (NaN) ,它与任何值(包括自身)都不比较相等。多个位模式可表示 NaN ,见 std::nan 、 NAN 。注意 C++ 不采取发信的 NaN 的特殊提醒,并把所有 NaN 当做安静的,除了以 std::numeric_limits::has_signaling_NaN 检测其支持。
实浮点数可用于算术运算符 + - / * 和各种来自 <cmath> 的数学函数。内建运算符和库函数都可能引发浮点异常,并如 math_errhandling 中所描述设置 errno 。
浮点表达式可拥有大于其类型所指示的范围和精度,见 FLT_EVAL_METHOD 。浮点表达式亦可缩略,即如同所有中间值拥有无限范围和精度一般求值,见 #pragma STDC FP_CONTRACT 。
浮点数上的某些运算受浮点环境的影响,并修改它(最值得注意的是舍入方向)。
隐式转换在实浮点类型和整数类型间定义。
浮点类型的额外细节、极限和属性见浮点类型极限和 std::numeric_limits 。
[编辑] 值范围
以下表格提供常用数值表示极限的参考。因为 C++ 标准允许任何有符号整数表示,表格给出最小受保证要求(对应反码或原码的极限)和最常用实现补码的极限。不过所有流行数据模型(包括 ILP32 、 LP32 、 LP64 、 LLP64 )都使用补码表示。
| 类型 | 位大小 | 格式 | 值域 | |
|---|---|---|---|---|
| 粗略 | 准确 | |||
| 字符 | 8 | 有符号(反码) | -127 到 127 | |
| 有符号(补码) | -128 到 127 | |||
| 无符号 | 0 到 255 | |||
| 16 | 无符号 | 0 到 65535 | ||
| 32 | 无符号 | 0 到 1114111 (0x10ffff) | ||
| 整数 | 16 | 有符号(反码) | ± 3.27 · 104 | -32767 到 32767 |
| 有符号 (补码) | -32768 到 32767 | |||
| 无符号 | 0 到 6.55 · 104 | 0 到 65535 | ||
| 32 | 有符号(反码) | ± 2.14 · 109 | -2,147,483,647 到 2,147,483,647 | |
| 有符号 (补码) | -2,147,483,648 到 2,147,483,647 | |||
| 无符号 | 0 到 4.29 · 109 | 0 到 4,294,967,295 | ||
| 64 | 有符号(反码) | ± 9.22 · 1018 | -9,223,372,036,854,775,807 到 9,223,372,036,854,775,807 | |
| 有符号(补码) | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | |||
| 无符号 | 0 到 1.84 · 1019 | 0 到 18,446,744,073,709,551,615 | ||
| 浮点 | 32 | IEEE-754 | ± 3.4 · 10± 38 (约 7 位十进制) |
|
| 64 | IEEE-754 | ± 1.7 · 10± 308 (约 15 位十进制) |
| |
注意:这些类型所能表示的值的实际(而非保证最小)极限可用于 <climits> 、 <cfloat> 和 std::numeric_limits 。
[编辑] 关键词
void, bool, true, false, char, wchar_t, char16_t, char32_t, int, short, long, signed, unsigned, float, double
[编辑] 参阅
| 算术类型 的 C 文档
|

