整数类型的大小
以下类型定义为整数类型 :
char
- 有符号整数类型
- 无符号整数类型
char16_t
和char32_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 节中指定 sizeof
为 unsigned char
,signed char
和 char
产生 1
(实现定义 char
类型是 signed
还是 unsigned
)。
Version => C++ 14
char
足以表示 256 个不同的值,适合存储 UTF-8 代码单元。
有符号和无符号整数类型的大小
该标准在第 3.9.1.2 节中规定,在标准有符号整数类型列表中,由 signed char
,short int
,int
,long int
和 long long int
组成,每种类型将提供至少与列表中前面的存储一样多的存储空间。此外,如第 3.9.1.3 节所述,这些类型中的每一种都具有相应的标准无符号整数类型 unsigned char
,unsigned short int
,unsigned int
,unsigned long int
和 unsigned long long int
,它们具有与其对应的有符号类型相同的大小和对齐方式。此外,如第 3.9.1.1 节所述,char
具有与 signed char
和 unsigned char
相同的尺寸和对齐要求。
Version < C++ 11
在 C++ 11 之前,long long
和 unsigned 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 位 ints
和 long
s,LP64 系统(如 64 位 Linux)具有 32 位数据模型 -bit int
s 和 64-bit long
s。因此,不能假定整数类型在所有平台上具有固定宽度。
Version => C++ 11
如果需要具有固定宽度的整数类型,请使用 <cstdint>
标头中的类型,但请注意,标准使其成为支持精确宽度类型的实现的可选项 int8_t
,int16_t
,int32_t
,int64_t
,intptr_t
,uint8_t
,uint16_t
,uint32_t
,uint64_t
和 uintptr_t
。
Version => C++ 11
char16_t
和 char32_t
的大小
char16_t
和 char32_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。
但请注意,标准本身并未特别提及这些模型。