基础类型

来自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 - 足以保有二个值 truefalse 之一的类型。 sizeof(bool) 的值为实现定义,而且可以异于 1 。

[编辑] 整数类型

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

[编辑] 数据模型

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

32 位系统:

  • LP322/4/4 ( int 为 16 位, 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 系统(例如 Unicos on Cray )。

[编辑] 字符类型

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 当做安静的,除了以 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

[编辑] 参阅

算术类型C 文档