命名空间
变体
操作

基本类型

来自 cppreference.com
< 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::nanNAN。请注意,C++ 不会对信号 NaN 进行特殊处理,除了通过 std::numeric_limits::has_signaling_NaN 检测它们的支撑,并将所有 NaN 视为静默。

浮点数可以与 算术运算符 +-/* 以及 <cmath> 中的各种数学函数一起使用。内置运算符和库函数都可能引发浮点异常并设置 errno,如 math errhandling 中所述。

浮点表达式可能具有比其类型指示的更大的范围和精度,请参阅 FLT_EVAL_METHOD。浮点表达式也可能被压缩,即,计算就好像所有中间值具有无限的范围和精度一样,请参阅 #pragma STDC FP_CONTRACT。标准 C++ 不限制浮点运算的精度。

浮点数上的某些运算会受到 浮点环境(最显著的是舍入方向)的状态的影响并修改其状态。

隐式转换 在浮点类型和整数类型之间定义。

有关浮点类型的更多详细信息、限制和属性,请参阅 浮点类型的限制std::numeric_limits

[edit] 值的范围

下表提供了对常见数值表示限制的参考。

在 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),不允许 8 位一补码和符号和幅度表示用于 char,因为在 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[note 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 中找到。

[edit] 数据模型

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

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)。

[edit] 注释

特性测试 标准 特性
__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 数组)

[edit] 关键字

voidbooltruefalsecharchar8_tchar16_tchar32_twchar_tintshortlongsignedunsignedfloatdouble

[edit] 缺陷报告

以下行为更改缺陷报告被追溯应用于以前发布的 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 要求能够为所有成员表示不同的代码
在受支持的语言环境中指定的最大扩展字符集
不要求

[edit] 参考文献

  • 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]

[edit] 另请参阅

C 文档 关于 算术类型