整数类型的大小

以下类型定义为整数类型

  • char
  • 有符号整数类型
  • 无符号整数类型
  • char16_tchar32_t
  • bool
  • wchar_t

sizeof(char) / sizeof(signed char) / sizeof(unsigned char) 除外,它分为§3.9.1.1[basic.fundamental / 1]和§5.3.3.1[expr.sizeof],以及 sizeof(bool),它完全是实现定义的,没有最小尺寸,这些类型的最小尺寸要求在标准的第 3.9.1 节[basic.fundamental]一节中给出,并在下面详述。

char 的大小

所有版本的 C++标准在第 5.3.3.1 节中指定 sizeofunsigned charsigned charchar 产生 1(实现定义 char 类型是 signed 还是 unsigned)。

Version => C++ 14

char 足以表示 256 个不同的值,适合存储 UTF-8 代码单元。

有符号和无符号整数类型的大小

该标准在第 3.9.1.2 节中规定,在标准有符号整数类型列表中,由 signed charshort intintlong intlong long int 组成,每种类型将提供至少与列表中前面的存储一样多的存储空间。此外,如第 3.9.1.3 节所述,这些类型中的每一种都具有相应的标准无符号整数类型 unsigned charunsigned short intunsigned intunsigned long intunsigned long long int,它们具有与其对应的有符号类型相同的大小和对齐方式。此外,如第 3.9.1.1 节所述,char 具有与 signed charunsigned char 相同的尺寸和对齐要求。

Version < C++ 11

在 C++ 11 之前,long longunsigned long long 并不正式成为 C++标准的一部分。但是,在 C99 中引入 C 之后,许多编译器支持 long long 作为扩展有符号整数类型unsigned long long 作为扩展无符号整数类型,具有与 C 类型相同的规则。

该标准因此保证:

1 == sizeof(char)  == sizeof(signed char) == sizeof(unsigned char)
  <= sizeof(short) == sizeof(unsigned short)
  <= sizeof(int)   == sizeof(unsigned int)
  <= sizeof(long)  == sizeof(unsigned long)
Version => C++ 11
 <= sizeof(long long) == sizeof(unsigned long long)

标准没有给出每种类型的具体最小尺寸。相反,每种类型都有它可以支持的最小值范围,如第 3.9.1.3 节所述,继承自 C 标准,在第 5.2.4.2.1 节中。通过确定所需的最小位数,可以从该范围粗略推断出每种类型的最小尺寸; 请注意,对于任何给定平台,任何类型的实际支持范围可能大于最小值。请注意,对于有符号类型,范围对应于一个补码,而不是更常用的二进制补码; 这是为了允许更广泛的平台符合标准。

类型 最小范围 所需的最小位数
signed char -127 至 127( - (2 7 - 1)至(2 7 - 1)) 8
unsigned char 0 到 255(0 到 2 8 - 1) 8
signed short -32,767 至 32,767( - (2 15 - 1)至(2 15 - 1)) 16
unsigned short 0 到 65,535(0 到 2 16 - 1) 16
signed int -32,767 至 32,767( - (2 15 - 1)至(2 15 - 1)) 16
unsigned int 0 到 65,535(0 到 2 16 - 1) 16
signed long -2,147,483,647 至 2,147,483,647( - (2 31 - 1)至(2 31 - 1)) 32
unsigned long 0 到 4,294,967,295(0 到 2 32 - 1) 32
Version => C++ 11
类型 最小范围 所需的最小位数
signed long long -9,223,372,036,854,775,807 9,223,372,036,854,775,807( - (2 63 - 1)到(2 63 - 1)) 64
unsigned long long 0 到 18,446,744,073,709,551,615(0 到 2 64 - 1) 64

由于允许每种类型大于其最小大小要求,因此实现之间的类型可能不同。最值得注意的例子是 64 位数据模型 LP64 和 LLP64,其中 LLP64 系统(如 64 位 Windows)具有 32 位 intslongs,LP64 系统(如 64 位 Linux)具有 32 位数据模型 -bit ints 和 64-bit longs。因此,不能假定整数类型在所有平台上具有固定宽度。

Version => C++ 11

如果需要具有固定宽度的整数类型,请使用 <cstdint> 标头中的类型,但请注意,标准使其成为支持精确宽度类型的实现的可选项 int8_tint16_tint32_tint64_tintptr_tuint8_tuint16_tuint32_tuint64_tuintptr_t

Version => C++ 11

char16_tchar32_t 的大小

char16_tchar32_t 的大小是按照第 5.3.3.1 节的规定实施定义的,并符合第 3.9.1.5 节的规定:

  • char16_t 足以表示任何 UTF-16 代码单元,并且具有与 uint_least16_t 相同的大小,符号和对齐方式 ; 因此,要求其尺寸至少为 16 位。

  • char32_t 足以表示任何 UTF-32 代码单元,并且具有与 uint_least32_t 相同的大小,符号和对齐方式 ; 因此,要求其尺寸至少为 32 位。

bool 的大小

bool 的大小是实现定义的,可能是也可能不是 1

wchar_t 的大小

wchar_t,如第 3.9.1.5 节所述,是一种不同的类型,其值范围可以表示支持的语言环境中最大扩展字符集的每个不同代码单元。它具有与其他整数类型相同的大小,符号和对齐方式,这被称为其基础类型。此类型的大小是实现定义的,如第 5.3.3.1 节中所述,并且可以是,例如,至少 8,16 或 32 位; 例如,如果系统支持 Unicode,则 wchar_t 至少需要 32 位(此规则的一个例外是 Windows,其中 wchar_t 为 16 位,用于兼容性目的)。它继承自 C90 标准,ISO 9899:1990§4.1.5,只有少量重写。

根据实现,wchar_t 的大小通常是,但不总是 8,16 或 32 位。最常见的例子是:

  • 在 Unix 和类 Unix 系统中,wchar_t 是 32 位的,通常用于 UTF-32。
  • 在 Windows 中,wchar_t 是 16 位,用于 UTF-16。
  • 在只有 8 位支持的系统上,wchar_t 是 8 位。
Version => C++ 11

如果需要 Unicode 支持,建议将 char 用于 UTF-8,char16_t 用于 UTF-16,或 char32_t 用于 UTF-32,而不是使用 wchar_t

数据模型

如上所述,整数类型的宽度可以在平台之间不同。最常见的模型如下,大小以位为单位指定:

模型 int long 指针
LP32(2/4/4) 16 32 32
ILP32(4/4/4) 32 32 32
LLP64(4/4/8) 32 32 64
LP64(4/8/8) 32 64 64

在这些模型中:

  • 16 位 Windows 使用 LP32。
  • 32 位* nix 系统(Unix,Linux,Mac OSX 和其他类 Unix 操作系统)和 Windows 使用 ILP32。
  • 64 位 Windows 使用 LLP64。
  • 64 位* nix 系统使用 LP64。

但请注意,标准本身并未特别提及这些模型。