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++标准库提供的类型相关工具列表

以下类型统称为 基础类型

  • (可能带有 cv 限定符) void
(since 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位。
(since C++11)

注意:与所有类型说明符一样,允许任意顺序: unsigned long long int long 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_t sizeof 运算符结果的无符号整数类型 ,同时也是 sizeof... 运算符和 alignof 运算符的结果类型 (C++11 起)

扩展整数类型

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

(since C++11)

布尔类型

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

字符类型

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

signed char — 用于有符号字符表示的类型。
unsigned char — 用于无符号字符表示的类型。也用于检查 对象表示 (原始内存)。
char — 在目标系统上能最高效处理的字符表示类型(与 signed char unsigned char 具有相同的表示形式和对齐方式,但始终是独立类型)。 多字节字符字符串 使用此类型表示代码单元。 对于范围 [ 0 , 255 ] 内的每个 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 相同(因此与 char signed char 具有相同的大小和对齐方式),但它是独立的类型。
(since 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强制要求的类型。

扩展浮点类型

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

(since 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。

浮点数可以与 算术运算符 + - / * 以及 <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的浮点类型的可表示值范围内。

<tr
类型 位大小 格式 值范围
近似值 精确值
字符 8 有符号 −128 127