Namespaces
Variants

Fundamental types

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

(另请参阅 类型 以了解类型系统概述,以及 C++ 库提供的类型相关工具列表

以下类型统称为 fundamental types

  • (可能带有 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 int long int unsigned long 表示同一类型。

属性

下表总结了所有可用的标准整数类型及其在各种常见数据模型中的属性:

(说明:根据要求,HTML标签和属性保持不变, 标签内的C++关键字"signed short int"属于C++术语不予翻译,因此整段内容保持原样输出)
类型说明符 等效类型 位宽(按 数据模型 划分)
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 起)

布尔类型

bool — 整数类型,能够持有两个值之一: true false sizeof ( bool ) 的值由实现定义,可能不等于 1

字符类型

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

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 上无法满足,因此被视为 缺陷 并已被移除。

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 相同(因此与 char signed 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++除通过 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
  • 最小次正规数:
    ± 1.401,298,4 · 10 −45
  • 最小正规数:
    ± 1.175,494,3 · 10 −38
  • 最大值:
    ± 3.402,823,4 · 10 38
  • 最小次正规数:
    ±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 · 10 308
  • 最小次正规数:
    ±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
    · 10 4932
  • 最小次正规数:
    ±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 · 10 4932
  • 最小次正规数:
    ±0x1p−16494
  • 最小正规数:
    ±0x1p−16382
  • 最大值:
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
  1. 对象表示通常在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 文档 关于 算术类型