基础类型

来自cppreference.com
< 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 - 可以持有这两个值之一的类型:truefalsesizeof(bool) 的值是由实现定义的,可能不等于 1。

[编辑] 字符类型

signed char - 有符号的字符表示类型。
unsigned char - 无符号的字符表示类型。也用于检视对象表示(原始内存)。
char - 在目标系统上可以最高效处理的字符表示类型(和 signed charunsigned char 之一具有相同的表示和对齐,但它是独立的类型)。多字节字符串使用这个类型来表示代码单元。字符类型的大小足够表示 256 个不同的值(以便适于存储 UTF-8 编码的数据)。 (C++14 起)
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 起)

[编辑] 整数类型

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

除了最小位数之外,C++ 标准还保证:

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

注:其允许字节具有 64 位大小这样的极限情况,此时所有的类型(包括 char)都具有 64 位 宽度,而对每个类型的 sizeof 都返回 1。

注:整数算术对有符号和无符号整数类型的定义是不同的。参见 算术运算符,尤其是整数溢出

[编辑] 数据模型

各个实现所选择采用的基础类型的大小统称为“数据模型”。有四种广泛采用的数据模型:

32 位系统:

  • LP322/4/4(int 为 16-bit,long 和指针为 32 位)
  • Win16 API
  • ILP324/4/4(int,long 和指针都为 32 位)
  • Win32 API
  • Unix 和 Unix 类的系统(Linux,Mac OS X)

64 位系统:

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

其他的模型都很少见。比如说,ILP648/8/8:int,long 和指针均为 64 位)只在某些早期 64 位 Unix 系统(比如 Cray 的 Unicos)上出现过。

[编辑] 浮点类型

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

[编辑] 性质

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

  • 无穷(正的和负的),参见 INFINITY
  • 负零-0.0。它和正零比较为相等,但在某些算术操作中是有意义的,例如,1.0/0.0 == INFINITY,而 1.0/-0.0 == -INFINITY),并且对于某些数学函数也有意义,例如 sqrt(std::complex)
  • 非数(NaN),它和任何值(包括其自身)比较均不相等。有多种位模式都代表 NaN,参见 std::nanNAN。需要注意的是,除了通过 std::numeric_limits::has_signaling_NaN 来检查对信号 NaN(signaling NaN)的支持以外,C++ 对信号 NaN 没有特殊的支持,并将所有的 NaN 都当做是静默的(quiet NaN)。

可以对实数浮点数值使用算术运算符 + - / * 和 cmath 中的各种数学函数。内建运算符和程序库函数都可能引发浮点异常并设置 errno,如 math_errhandling 所述。

浮点表达式可能具有比其类型所指定的更大的数值范围和精度,参见 FLT_EVAL_METHOD。浮点表达式还可以是紧缩的(contracted),就是说,它们的计算如同其中的中间值都具有无穷的数值范围和精度,参见 #pragma STDC FP_CONTRACT

对浮点数值的某些运算可能受到浮点环境(尤其是舍入方向)的影响,或改变其状态。

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

有关浮点类型的其他细节,限制和性质,请参见浮点类型的限制std::numeric_limits

[编辑] 值的范围

下表为常见的数值表示提供了一个参考。由于 C++ 标准允许任意的有符号整数表示,此表既给出了最小确保规定(对应于一的补码带符号量表示),也给出在最常用的实现上的限制,二的补码表示。虽然所有的常用数据模型(包括 ILP32,LP32,LP64,LLP64)使用的都是二的补码表示。

类型 位数 格式 值的范围
近似 精确
字符 8 signed (一的补码) -127127[note 1]
signed (二的补码) -128127
unsigned 0255
16 unsigned 065535
32 unsigned 011141110x10ffff
整型 16 signed (一的补码) ± 3.27 · 104 -3276732767
signed (二的补码) -3276832767
unsigned 06.55 · 104 065535
32 signed (一的补码) ± 2.14 · 109 -2,147,483,6472,147,483,647
signed (二的补码) -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,8079,223,372,036,854,775,807
signed (二的补码) -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 ± 3.4 · 10± 38
(约 7 位数字)
  • 最小次正规:± 1.401,298,4 · 10-47
  • 最小正规:± 1.175,494,3 · 10-38
  • 最大:± 3.402,823,4 · 1038
64 IEEE-754 ± 1.7 · 10± 308
(约 15 位数字)
  • 最小次正规:± 4.940,656,458,412 · 10-324
  • 最小正规:± 2.225,073,858,507,201,4 · 10-308
  • 最大:± 1.797,693,134,862,315,7 · 10308
  1. 自 C++14 起,char 必须表示 256 个不同值,可以双射地转换为 unsigned char 的值 0..255,这可能需要一个更宽的值范围。

注:对这些类型所能表示的值的实际(而不是最小确保的)限制,在 <climits>,<cfloat>std::numeric_limits 中给出。

[编辑] 关键字

booltruefalsecharwchar_tchar16_tchar32_tintshortlongsignedunsignedfloatdouble

[编辑] 另请参阅

算术类型C 文档