基础类型

< cpp‎ | language

(类型系统概览见类型,以及参阅 C++ 库提供的类型相关的工具列表

void 类型

void - 值为空集的类型。它是无法完成的不完整类型(从而不允许存在 void 类型的对象)。不存在含有 void数组以及到 void引用。然而 指向 void 的指针和返回 void 类型的函数是允许存在的(其他语言中的过程)。

std::nullptr_t

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

std::nullptr_t 是空指针字面量 nullptr 的类型。它是独立类型,既非指针类型,亦非成员指针类型。

布尔类型

bool - 足以存放两个值 truefalse 之一的类型。 sizeof(bool) 的值由实现定义,而且可以不为 1 。

数据模型

每个实现关于基础类型大小所做的选择被统称为数据模型。有四个数据模型广为接受:

32 位系统:

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

64 位系统:

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

其他数据模型很罕见。例如, ILP648/8/8 : int 、 long 和指针为 64 位)只出现于某些早期 64 位 Unix 系统(例如 Unicos on Cray )。

整数类型

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

字符类型

signed char - 有符号字符表示的类型。
unsigned char - 无符号字符表示的类型。亦用于审查对象表示(无修饰内存)。
char - 能在目标系统上最有效地处理的字符表示的类型(拥有与 signed charunsigned char 之一相同的表示和对齐,但始终是独立的类型)。多字节字符串用此类型表示编码单元。各字符类型均大到足以表示任何 UTF-8 的八位编码单元。 (C++14 起) char 的符号性取决于编译器和目标平台: ARM 和 PowerPC 的默认设置常为无符号,而 x86 与 x64 的默认设置常为有符号。
wchar_t - 宽字符表示的类型(见宽字符串)。要求大到足以表示任何受支持的字符编码位点(支持 Unicode 的系统上为 32 位。值得注意的例外是 Windows,其中 wchar_t 为 16 位并保有 UTF-16 编码单元)。它与上述整数类型之一具有相同的大小、符号性和对齐,但它是独立的类型。
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。

浮点类型

float - 单精度浮点类型。通常为 IEEE-754 32 位浮点类型
double - 双精度浮点类型。通常为 IEEE-754 64 位浮点类型
long double - 扩展精度浮点类型。不一定映射到 IEEE-754 所强制的类型。在 x86 和 x86-64 架构上通常为 80 位 x87 浮点类型。

性质

浮点类型可以支持一些特殊值

  • 无穷(正和负),见 INFINITY
  • 负零-0.0。它与正零比较相等,但在某些算术运算中有意义,例如 1.0/0.0 == INFINITY ,但 1.0/-0.0 == -INFINITY),而且对某些数学函数有意义,例如 sqrt(std::complex)
  • 非数 (NaN) ,它与任何值(包括自身)比较都不相等。多个位模式都表示 NaN,见 std::nanNAN 。注意 C++ 并不对发信 NaN 进行特殊对待,把所有 NaN 均当做静默 NaN,但提供了 std::numeric_limits::has_signaling_NaN 用以检测它们的支持情况。

实浮点数可用于算术运算符 + - / * 和各种来自 <cmath> 的数学函数。内建运算符和库函数都可能引发浮点异常,并按 math_errhandling 中的描述设置 errno

浮点表达式可拥有大于其类型所指定的值域和精度,见 FLT_EVAL_METHOD。浮点表达式亦可收缩,即在计算时将所有中间值视为拥有无限范围和精度,见 #pragma STDC FP_CONTRACT

浮点数上的某些运算受浮点环境的状态影响,并可对其进行修改(最值得注意的是舍入方向)。

在实浮点类型和整数类型间定义了隐式转换

浮点类型的其他细节、界限和性质见浮点类型的界限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 )。

类型 位数 格式 取值范围
近似 精确
字符 8 有符号 -128127
无符号 0255
16 无符号 065535
32 无符号 01114111 (0x10ffff)
整数 16 有符号 ± 3.27 · 104 -3276832767
无符号 06.55 · 104 065535
32 有符号 ± 2.14 · 109 -2,147,483,6482,147,483,647
无符号 04.29 · 109 04,294,967,295
64 有符号 ± 9.22 · 1018 -9,223,372,036,854,775,8089,223,372,036,854,775,807
无符号 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


注意:这些类型可表示的值的实际界限(与保证的最小界限相对)可通过 <climits><cfloat>std::numeric_limits 获知。

关键词

void, bool, true, false, char, wchar_t, char8_t, char16_t, char32_t, int, short, long, signed, unsigned, float, double

参阅