基本型別
(另請參閱 型別 獲取型別系統概述,以及 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 具有相同的表示和對齊方式,但始終是不同的型別)。多位元組字串使用此型別表示程式碼單元。對於 unsigned char 型別在範圍
[0,255]中的每個值,將該值轉換為 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)。
注:這允許極端情況,即 位元組 大小為 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-extended 格式 是 x87 80 位擴充套件精度格式。它被許多 x86 和 x86-64 實現使用(一個值得注意的例外是 MSVC,它將 long double 實現為與 double 相同的格式,即 binary64)。
- 在 PowerPC 上可以使用 double-double。
擴充套件浮點型別擴充套件浮點型別是實現定義的。它們可能包括固定寬度浮點型別。 |
(C++23 起) |
[編輯] 屬性
浮點型別可能支援特殊值
- 無窮大(正無窮和負無窮),參見 INFINITY
- 負零,-0.0。它與正零比較相等,但在某些算術運算中具有意義,例如 1.0 / 0.0 == INFINITY,但 1.0 / -0.0 == -INFINITY),以及某些數學函式,例如 sqrt(std::complex)
- 非數值 (NaN),它不與任何值(包括自身)比較相等。多個位模式表示 NaN,參見 std::nan, NAN。請注意,C++ 不對信令 NaN 進行特殊處理,除了透過 std::numeric_limits::has_signaling_NaN 檢測其支援外,所有 NaN 都被視為靜默。
浮點數可以與算術運算子 +、-、/ 和 * 以及 <cmath> 中的各種數學函式一起使用。內建運算子和庫函式都可能引發浮點異常並設定 errno,如 math errhandling 中所述。
浮點表示式可能具有比其型別指示的更大範圍和精度,請參閱 FLT_EVAL_METHOD。浮點表示式也可以是收縮的,即,計算時如同所有中間值都具有無限範圍和精度,請參閱 #pragma STDC FP_CONTRACT。標準 C++ 不限制浮點運算的精度。
某些浮點數運算會受浮點環境狀態(最顯著的是舍入方向)的影響並修改其狀態。
隱式轉換在浮點型別和整數型別之間定義。
有關浮點型別的其他詳細資訊、限制和屬性,請參見浮點型別的限制和std::numeric_limits。
[編輯] 值範圍
下表提供了常見數值表示的限制參考。
在 C++20 之前,C++ 標準允許任何有符號整型表示,N 位有符號整型的最小保證範圍是從 -(2N-1
-1) 到 +2N-1
-1(例如,對於 8 位有符號型別,為 −127 到 127),這對應於補碼或符號-大小的限制。
然而,所有 C++ 編譯器都使用 二進位制補碼 表示,並且從 C++20 開始,它是標準唯一允許的表示,保證範圍從 -2N-1
到 +2N-1
-1(例如,對於有符號 8 位型別,範圍為 −128 到 127)。
自 C++11 起(透過 CWG 問題 1759 的解決),char 的 8 位補碼和符號-大小表示已被禁止,因為 UTF-8 字串字面量 中使用的值為 0x80 的 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 | ||
| 二進位制 浮點型 浮點 |
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++ 標準。
| 缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
|---|---|---|---|
| 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 要求能夠表示所支援語言環境中最長擴充套件字元集的所有成員的不同程式碼 未要求 |
未要求 |
[編輯] 參考
- 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 文件 算術型別
|