命名空间
变体
操作

基本类型

来自 cppreference.cn
< cpp‎ | language
 
 
C++ 语言
通用主题
流程控制
条件执行语句
if
迭代语句(循环)
for
范围 for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (在 C++17* 前已弃用)
noexcept 说明符 (C++11)
异常
命名空间
类型
基本类型
枚举类型
函数类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储期说明符
初始化
 
 

(另见 type 以了解类型系统概述,并见 C++ 库提供的类型相关工具列表

下列类型统称为基本类型 

  • (可能带 cv 限定) void
(自 C++11 起)

内容

[编辑] void

void — 具有空值集的类型。它是一个不完整类型,无法完成(因此,不允许使用 void 类型的对象)。不存在 void数组,也不存在到 void引用。但是,允许使用void 的指针和返回 void 类型的函数(其他语言中的过程)。

std::nullptr_t

定义于头文件 <cstddef>
typedef decltype(nullptr) nullptr_t;
(自 C++11 起)

std::nullptr_t 是空指针字面量 nullptr 的类型。它是一个独特的类型,本身不是指针类型或指向成员的指针类型。其所有纯右值都是空指针常量

sizeof(std::nullptr_t) 等于 sizeof(void*)

(自 C++11 起)

[编辑] 整型

[编辑] 标准整型

int — 基本整型。如果使用下列任何修饰符,则关键字 int 可以省略。如果不存在长度修饰符,则保证具有至少 16 位的宽度。但是,在 32/64 位系统上,几乎完全保证具有至少 32 位的宽度(见下文)。
[编辑] 修饰符

修饰基本整型。可以以任何顺序混合使用。每组中只能存在一个修饰符在类型名称中。

  • 符号性
signed — 目标类型将具有带符号表示(如果省略则这是默认值)
unsigned — 目标类型将具有无符号表示
  • 尺寸
short — 目标类型将针对空间进行优化,并将具有至少 16 位的宽度。
long — 目标类型将具有至少 32 位的宽度。

long long — 目标类型将具有至少 64 位的宽度。
(自 C++11 起)

注意:与所有类型说明符一样,允许任何顺序:unsigned long long intlong 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_tsizeof 运算符以及 sizeof... 运算符和 alignof 运算符的结果的无符号整型(自 C++11 起)

扩展整型

扩展整型是实现定义的。请注意,固定宽度整型通常是标准整型的别名。

(自 C++11 起)

[编辑] 布尔类型

bool — 整型,能够容纳两个值之一:truefalsesizeof(bool) 的值是实现定义的,可能与 1 不同。

[编辑] 字符类型

字符类型是用于字符表示的整型。

signed char — 用于有符号字符表示的类型。
unsigned char — 用于无符号字符表示的类型。也用于检查对象表示(原始内存)。
char — 用于字符表示的类型,可以在目标系统上最有效地处理(具有与 signed charunsigned char 相同的表示和对齐方式,但始终是不同的类型)。多字节字符字符串使用此类型表示代码单元。对于 [0255] 范围内 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 上无法满足这样的要求,因此它被视为缺陷并被移除。

char16_t — 用于 UTF-16 字符表示的类型,要求足够大以表示任何 UTF-16 代码单元(16 位)。它具有与 std::uint_least16_t 相同的大小、符号性和对齐方式,但它是一个不同的类型。

char32_t — 用于 UTF-32 字符表示的类型,要求足够大以表示任何 UTF-32 代码单元(32 位)。它具有与 std::uint_least32_t 相同的大小、符号性和对齐方式,但它是一个不同的类型。
(自 C++11 起)

char8_t — 用于 UTF-8 字符表示的类型,要求足够大以表示任何 UTF-8 代码单元(8 位)。它具有与 unsigned char 相同的大小、符号性和对齐方式(因此,与 charsigned char 相同的大小和对齐方式),但它是一个不同的类型。
(自 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 规定的类型。

扩展浮点类型

扩展浮点类型是实现定义的。它们可能包括固定宽度浮点类型

(自 C++23 起)

[编辑] 属性

浮点类型可以支持特殊值

  • 无穷大(正无穷大和负无穷大),参见 INFINITY
  • 负零-0.0。它与正零比较相等,但在某些算术运算中意义重大,例如 1.0 / 0.0 == INFINITY,但 1.0 / -0.0 == -INFINITY),以及对于某些数学函数,例如 sqrt(std::complex)
  • 非数 (NaN),它与任何事物(包括自身)都不相等。多个位模式表示 NaN,参见 std::nanNAN。请注意,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 位类型,为 −127127),这对应于反码符号-数值表示法的限制。

但是,所有 C++ 编译器都使用补码表示,并且从 C++20 开始,它是标准唯一允许的表示,保证范围从 -2N-1
+2N-1
-1
(例如,对于有符号 8 位类型,为 −128127)。

由于 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 −128127
unsigned 0255
16 UTF-16 065535
32 UTF-32 01114111 (0x10ffff)
整数 (integer) 16 signed ± 3.27 · 104 −3276832767
unsigned 06.55 · 104 065535
32 signed ± 2.14 · 109 −2,147,483,6482,147,483,647
unsigned 04.29 · 109 04,294,967,295
64 signed ± 9.22 · 1018 −9,223,372,036,854,775,8089,223,372,036,854,775,807
unsigned 01.84 · 1019 018,446,744,073,709,551,615
二进制 (binary)
浮点 (floating-)
点 (point)
32 IEEE-754
  • 最小次正规值 (min subnormal)
    ± 1.401,298,4 · 10−45
  • 最小正规值 (min normal)
    ± 1.175,494,3 · 10−38
  • 最大值 (max)
    ± 3.402,823,4 · 1038
  • 最小次正规值 (min subnormal)
    ±0x1p−149
  • 最小正规值 (min normal)
    ±0x1p−126
  • 最大值 (max)
    ±0x1.fffffep+127
64 IEEE-754
  • 最小次正规值 (min subnormal)
    ± 4.940,656,458,412 · 10−324
  • 最小正规值 (min normal)
    ± 2.225,073,858,507,201,4 · 10−308
  • 最大值 (max)
    ± 1.797,693,134,862,315,7 · 10308
  • 最小次正规值 (min subnormal)
    ±0x1p−1074
  • 最小正规值 (min normal)
    ±0x1p−1022
  • 最大值 (max)
    ±0x1.fffffffffffffp+1023
80[note 1] x86
  • 最小次正规值 (min subnormal)
    ± 3.645,199,531,882,474,602,528
     · 10−4951
  • 最小正规值 (min normal)
    ± 3.362,103,143,112,093,506,263
     · 10−4932
  • 最大值 (max)
    ± 1.189,731,495,357,231,765,021
     · 104932
  • 最小次正规值 (min subnormal)
    ±0x1p−16445
  • 最小正规值 (min normal)
    ±0x1p−16382
  • 最大值 (max)
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • 最小次正规值 (min subnormal)
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10−4966
  • 最小正规值 (min normal)
    ± 3.362,103,143,112,093,506,262,
    677,817,321,752,602,6 · 10−4932
  • 最大值 (max)
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 104932
  • 最小次正规值 (min subnormal)
    ±0x1p−16494
  • 最小正规值 (min normal)
    ±0x1p−16382
  • 最大值 (max)
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
  1. 对象表示通常在 32/64 位平台上分别占用 96/128 位。

注意:这些类型可表示的值的实际(与保证的最小值相反)限制可在 C 数值限制接口std::numeric_limits 中找到。

[编辑] 数据模型

每个实现关于基本类型大小的选择统称为数据模型。四种数据模型被广泛接受

32 位系统

  • LP322/4/4 (int 为 16 位,long 和指针为 32 位)
  • Win16 API
  • ILP324/4/4 (intlong 和指针为 32 位);
  • Win32 API
  • Unix 和类 Unix 系统 (Linux, macOS)

64 位系统

  • LLP644/4/8 (intlong 为 32 位,指针为 64 位)
  • LP644/8/8 (int 为 32 位,long 和指针为 64 位)
  • Unix 和类 Unix 系统 (Linux, macOS)

其他模型非常罕见。例如,ILP64 (8/8/8: intlong 和指针为 64 位) 仅出现在一些早期的 64 位 Unix 系统中(例如 Cray 上的 UNICOS)。

[编辑] 注释

特性测试 标准 特性
__cpp_unicode_characters 200704L (C++11) 新字符类型 (char16_tchar32_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 文档 关于 算术类型