整數型別的大小
以下型別定義為整數型別 :
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。
但請注意,標準本身並未特別提及這些模型。