基本型別
(參見 型別 以了解型別系統概覽,以及 C++ 函式庫提供的型別相關工具列表)
下列型別統稱為「基本型別」
- (可能具有 cv 限定符的) void
|
(C++11 起) |
目錄 |
[編輯] void
- void — 具有空值集的型別。它是一種 不完整型別,無法被完成(因此,不允許存在 void 型別的物件)。不存在 void 的 陣列,也不存在指向 void 的 參考。然而,指向 void 的指標 以及回傳 void 型別的 函式(在其他語言中稱為「程序」)是被允許的。
|
std::nullptr_t
std::nullptr_t 是空指標字面量 sizeof(std::nullptr_t) 等同於 sizeof(void*)。 |
(C++11 起) |
[編輯] 整數型別
[編輯] 標準整數型別
- int — 基本整數型別。若使用了下列任何修飾符,關鍵字 int 可以省略。若未提供長度修飾符,則保證其寬度至少為 16 位元。然而,在 32/64 位元系統上,它幾乎絕對保證至少有 32 位元的寬度(見下文)。
[編輯] 修飾符
修飾基本整數型別。可以按任何順序混合使用。每組修飾符在型別名稱中只能出現一個。
- 帶正負號性
- signed — 目標型別將具有帶正負號的表示方式(若省略,則預設為此項)
- unsigned — 目標型別將具有無正負號的表示方式
- 大小
- short — 目標型別將針對空間進行最佳化,寬度至少為 16 位元。
- long — 目標型別寬度至少為 32 位元。
|
|
(C++11 起) |
注意:與所有型別說明符一樣,允許任何順序:unsigned long long int 與 long int unsigned long 指向同一個型別。
[編輯] 屬性
下表總結了所有可用的標準整數型別及其在各種常見資料模型中的屬性
| 型別說明符 | 等價型別 | 按資料模型劃分的位元寬度 | ||||
|---|---|---|---|---|---|---|
| C++ 標準 | LP32 | ILP32 | LLP64 | LP64 | ||
signed char
|
signed char | 至少 8 |
8 | 8 | 8 | 8 |
unsigned char
|
unsigned char | |||||
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_t 是 sizeof 運算子結果的無正負號整數型別,也包括 sizeof... 運算子與 alignof 運算子(C++11 起)。
延伸整數型別延伸整數型別是由實作定義的。請注意,固定寬度整數型別通常是標準整數型別的別名。 |
(C++11 起) |
[編輯] 布林型別
[編輯] 字元型別
字元型別是用於字元表示的整數型別。
- signed char — 用於帶正負號字元表示的型別。
- unsigned char — 用於無正負號字元表示的型別。也用於檢視 物件表示(原始記憶體)。
- char — 用於目標系統上能最有效處理的字元表示型別(其表示方式與對齊方式與 signed char 或 unsigned char 相同,但始終是一個獨立的型別)。多位元組字元字串使用此型別來表示程式碼單元。對於範圍在
[0,255]內的每一個 unsigned char 型別值,將該值轉換為 char 再轉回 unsigned char 會產生原始值。(C++11 起) char 的帶正負號性取決於編譯器與目標平台:ARM 與 PowerPC 的預設值通常是無正負號,而 x86 與 x64 的預設值通常是帶正負號。 - wchar_t — 用於寬字元表示的型別(參見 寬字串)。它具有與某個整數型別相同的大小、帶正負號性與對齊方式,但是一個獨立的型別。在實務上,它在 Linux 與許多其他非 Windows 系統上為 32 位元並保存 UTF-32,但在 Windows 上為 16 位元並保存 UTF-16 程式碼單元。標準曾要求 wchar_t 必須足夠大以表示任何支援的字元碼點。然而,此要求在 Windows 上無法實現,因此被視為一個 缺陷 並已移除。
|
|
(C++11 起) |
|
|
(自 C++20 起) |
除了最小位元數外,C++ 標準保證
- 1 == sizeof(char)
≤sizeof(short)≤sizeof(int)≤sizeof(long)≤sizeof(long long)。
注意:這允許一種極端情況,即 位元組 (bytes) 大小為 64 位元,所有型別(包括 char)寬度均為 64 位元,且 sizeof 對每個型別都回傳 1。
[編輯] 浮點型別
[編輯] 標準浮點型別
以下三種型別及其 cv 限定版本統稱為標準浮點型別。
- float — 單精度浮點型別。通常為 IEEE-754 binary32 格式。
- double — 雙精度浮點型別。通常為 IEEE-754 binary64 格式。
- long double — 擴充精度浮點型別。不一定對應 IEEE-754 強制規定的型別。
- IEEE-754 binary128 格式 被一些 HP-UX、SPARC、MIPS、ARM64 與 z/OS 實作所使用。
- 最廣為人知的 IEEE-754 binary64-擴充格式 是 x87 80 位元擴充精度格式。它被許多 x86 與 x86-64 實作所使用(一個顯著的例外是 MSVC,它將 long double 實作為與 double 相同的格式,即 binary64)。
- 在 PowerPC 上可以使用 double-double。
延伸浮點型別延伸浮點型別是由實作定義的。它們可能包含 固定寬度浮點型別。 |
(自 C++23 起) |
[編輯] 屬性
浮點型別可能支援 特殊值
- 無限大 (infinity)(正數與負數),參見 INFINITY
- 負零 (negative zero),-0.0。它在比較時等於正零,但在某些算術運算中是有意義的,例如 1.0 / 0.0 == INFINITY,但 1.0 / -0.0 == -INFINITY,且對於某些數學函式,例如 sqrt(std::complex)
- 非數 (NaN),它與任何值比較皆不相等(包含它自己)。多個位元模式代表 NaN,參見 std::nan, NAN。請注意,除了透過 std::numeric_limits::has_signaling_NaN 偵測其支援外,C++ 對信號 NaN (signalling NaN) 沒有特殊處理,並將所有 NaN 視為安靜 NaN (quiet NaN)。
浮點數可與 算術運算子 +, -, /, 及 * 以及來自 <cmath> 的各種數學函式一起使用。內建運算子與函式庫函式皆可能引發浮點例外並設置 errno,如 math errhandling 所述。
浮點運算式可能具有比其型別所指示的更大範圍與精度,參見 FLT_EVAL_METHOD。浮點運算式也可能被 收縮 (contracted),即計算時假設所有中間值具有無限的範圍與精度,參見 #pragma STDC FP_CONTRACT。標準 C++ 不限制浮點運算的準確度。
浮點數上的某些運算會受到 浮點環境 狀態(特別是捨入方向)的影響與修改。
浮點型別與整數型別之間定義了 隱式轉換。
參見 浮點型別的限制 與 std::numeric_limits 以獲取關於浮點型別的額外詳細資訊、限制與屬性。
[編輯] 數值範圍
下表提供了常見數值表示限制的參考。
在 C++20 之前,C++ 標準允許任何帶正負號整數表示法,N 位元帶正負號整數保證的最小範圍是從 -(2N-1
-1) 到 +2N-1
-1(例如對於 8 位元帶正負號型別為 −127 到 127),這對應於 一補數 或 符號與大小 表示法的限制。
然而,所有 C++ 編譯器都使用 二補數 (two's complement) 表示法,且自 C++20 起,這是標準允許的唯一表示法,保證範圍從 -2N-1
到 +2N-1
-1(例如對於 8 位元帶正負號型別為 −128 到 127)。
char 的 8 位元一補數與符號大小表示法自 C++11 起已不再被允許(透過 CWG 問題 1759 的解決方案),因為值為 0x80 的 UTF-8 程式碼單元若用於 UTF-8 字串字面量,必須能夠儲存在 char 型別物件中。
浮點型別 T 的範圍定義如下
- 保證的最小範圍是從
T中可表示的最負有限浮點數到T中可表示的最正有限浮點數。 - 若負無限大可在
T中表示,則T的範圍延伸至所有負實數。 - 若正無限大可在
T中表示,則T的範圍延伸至所有正實數。
由於負與正無限大可在 ISO/IEC/IEEE 60559 格式中表示,所有實數均位於符合 ISO/IEC/IEEE 60559 的浮點型別可表示值的範圍內。
| 類型 | 位元大小 | 格式 | 數值範圍 | |
|---|---|---|---|---|
| 近似值 | 精確值 | |||
| 字元 | 8 | signed | −128 到 127 | |
| unsigned | 0 到 255 | |||
| 16 | UTF-16 | 0 到 65535 | ||
| 32 | UTF-32 | 0 到 1114111 (0x10ffff) | ||
| 整數 | 16 | signed | ± 3.27 · 104 | −32768 到 32767 |
| unsigned | 0 到 6.55 · 104 | 0 到 65535 | ||
| 32 | signed | ± 2.14 · 109 | −2,147,483,648 到 2,147,483,647 | |
| unsigned | 0 到 4.29 · 109 | 0 到 4,294,967,295 | ||
| 64 | signed | ± 9.22 · 1018 | −9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | |
| unsigned | 0 到 1.84 · 1019 | 0 到 18,446,744,073,709,551,615 | ||
| binary 浮點 數 |
32 | IEEE-754 |
|
|
| 64 | IEEE-754 |
|
| |
| 80[註 1] | x86 |
|
| |
| 128 | IEEE-754 |
|
| |
- ↑ 物件表示在 32/64 位元平台上通常分別佔用 96/128 位元。
注意:這些型別可表示數值的實際(而非保證的最小)限制可在 C 數值限制介面 與 std::numeric_limits 中找到。
[編輯] 資料模型
每個實作對基本型別大小所做的選擇統稱為 資料模型。四種資料模型已獲得廣泛採用
32 位元系統
- LP32 或 2/4/4 (int 為 16 位元,long 與指標為 32 位元)
- Win16 API
- ILP32 或 4/4/4 (int、long 與指標皆為 32 位元);
- Win32 API
- Unix 與類 Unix 系統 (Linux, macOS)
64 位元系統
- LLP64 或 4/4/8 (int 與 long 為 32 位元,指標為 64 位元)
- LP64 或 4/8/8 (int 為 32 位元,long 與指標為 64 位元)
- Unix 與類 Unix 系統 (Linux, macOS)
其他模型非常罕見。例如,ILP64 (8/8/8:int、long 與指標皆為 64 位元) 僅出現在一些早期的 64 位元 Unix 系統中(例如 Cray 上的 UNICOS)。
[編輯] 註解
| 功能測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__cpp_unicode_characters |
200704L |
(C++11) | 新字元型別 (char16_t 與 char32_t) |
__cpp_char8_t |
201811L |
(C++20) | char8_t |
202207L |
(C++23) | char8_t 相容性與可攜性修復(允許從 UTF-8 字串字面量 初始化 (unsigned) char 陣列) |
[編輯] 關鍵字
void, bool, true, false, char, char8_t, char16_t, char32_t, wchar_t, int, short, long, signed, unsigned, float, double
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯應用於之前的 C++ 標準。
| DR | 應用於 | 出版時的行為 | 正確的行為 |
|---|---|---|---|
| CWG 238 | C++98 | 浮點實作所受的限制是不明確的 | 指定為 無限制 |
| CWG 1759 | C++11 | char 不保證能表示 UTF-8 程式碼單元 0x80 | 保證 |
| CWG 2689 | C++11 | cv 限定的 std::nullptr_t 不是基本型別 | 現在是了 |
| CWG 2723 | C++98 | 浮點型別的可表示值範圍未指定 | 已指定 |
| P2460R2 | C++98 | wchar_t 被要求必須能為所有成員表示不同的程式碼 在支援的地區設定 (locale) 中指定的最大延伸字元集 |
不再需要 |
[編輯] 參考資料
- C++23 標準 (ISO/IEC 14882:2024)
- 6.8.2 基本型別 [basic.fundamental]
- C++20 標準 (ISO/IEC 14882:2020)
- 6.8.1 基本型別 [basic.fundamental]
- C++17 標準 (ISO/IEC 14882:2017)
- 6.9.1 基本型別 [basic.fundamental]
- C++14 標準 (ISO/IEC 14882:2014)
- 3.9.1 基本型別 [basic.fundamental]
- C++11 標準 (ISO/IEC 14882:2011)
- 3.9.1 基本型別 [basic.fundamental]
- C++03 標準 (ISO/IEC 14882:2003)
- 3.9.1 基本型別 [basic.fundamental]
- C++98 標準 (ISO/IEC 14882:1998)
- 3.9.1 基本型別 [basic.fundamental]
[編輯] 參見
| C 說明文件 之 算術型別
|