命名空间
变体
操作

基本类型

来自 cppreference.cn
< cpp‎ | 语言
 
 
C++ 语言
 
 

(另请参阅 类型 获取类型系统概述,以及 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 具有相同的表示和对齐方式,但始终是不同的类型)。多字节字符串使用此类型表示代码单元。对于 unsigned char 类型在范围 [0255] 中的每个值,将该值转换为 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::nan, NAN。请注意,C++ 不对信令 NaN 进行特殊处理,除了通过 std::numeric_limits::has_signaling_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 起(通过 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 signed −128127
unsigned 0255
16 UTF-16 065535
32 UTF-32 01114111 (0x10ffff)
整型 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
二进制
浮点型
浮点
32 IEEE-754
  • 最小非规范数
    ± 1.401,298,4 · 10−45
  • 最小规范数
    ± 1.175,494,3 · 10−38
  • 最大值
    ± 3.402,823,4 · 1038
  • 最小非规范数
    ±0x1p−149
  • 最小规范数
    ±0x1p−126
  • 最大值
    ±0x1.fffffep+127
64 IEEE-754
  • 最小非规范数
    ± 4.940,656,458,412 · 10−324
  • 最小规范数
    ± 2.225,073,858,507,201,4 · 10−308
  • 最大值
    ± 1.797,693,134,862,315,7 · 10308
  • 最小非规范数
    ±0x1p−1074
  • 最小规范数
    ±0x1p−1022
  • 最大值
    ±0x1.fffffffffffffp+1023
80[注 1] x86
  • 最小非规范数
    ± 3.645,199,531,882,474,602,528
     · 10−4951
  • 最小规范数
    ± 3.362,103,143,112,093,506,263
     · 10−4932
  • 最大值
    ± 1.189,731,495,357,231,765,021
     · 104932
  • 最小非规范数
    ±0x1p−16445
  • 最小规范数
    ±0x1p−16382
  • 最大值
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • 最小非规范数
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10−4966
  • 最小规范数
    ± 3.362,103,143,112,093,506,262,
    677,817,321,752,602,6 · 10−4932
  • 最大值
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 104932
  • 最小非规范数
    ±0x1p−16494
  • 最小规范数
    ±0x1p−16382
  • 最大值
    ±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)

其他模型非常罕见。例如,ILP648/8/8intlong 和指针均为 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++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
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 文档 算术类型