命名空間
變體
動作

基本型別

出自 cppreference.com
< cpp‎ | language
 
 
C++ 語言
一般主題
流程控制
條件執行陳述式
if
疊代陳述式 (迴圈)
for
範圍 for (C++11)
跳躍陳述式
函式
函式宣告
Lambda 函式運算式
inline 指定符
動態例外規範 (直到 C++17*)
noexcept 指定符 (C++11)
例外
命名空間
型別
基本型別
列舉型別
函式型別
指定符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期指定符
初始化
 
 

(參見 型別 以了解型別系統概覽,以及 C++ 函式庫提供的型別相關工具列表)

下列型別統稱為「基本型別」

  • (可能具有 cv 限定符的) void
(C++11 起)

目錄

[編輯] void

void — 具有空值集的型別。它是一種 不完整型別,無法被完成(因此,不允許存在 void 型別的物件)。不存在 void陣列,也不存在指向 void參考。然而,指向 void 的指標 以及回傳 void 型別的 函式(在其他語言中稱為「程序」)是被允許的。

std::nullptr_t

定義於標頭檔 <cstddef>
typedef decltype(nullptr) nullptr_t;
(C++11 起)

std::nullptr_t 是空指標字面量 nullptr 的型別。它是一個獨特的型別,其本身不是指標型別或成員指標型別。它所有的純右值 (prvalue) 都是 空指標常數

sizeof(std::nullptr_t) 等同於 sizeof(void*)

(C++11 起)

[編輯] 整數型別

[編輯] 標準整數型別

int — 基本整數型別。若使用了下列任何修飾符,關鍵字 int 可以省略。若未提供長度修飾符,則保證其寬度至少為 16 位元。然而,在 32/64 位元系統上,它幾乎絕對保證至少有 32 位元的寬度(見下文)。
[編輯] 修飾符

修飾基本整數型別。可以按任何順序混合使用。每組修飾符在型別名稱中只能出現一個。

  • 帶正負號性
signed — 目標型別將具有帶正負號的表示方式(若省略,則預設為此項)
unsigned — 目標型別將具有無正負號的表示方式
  • 大小
short — 目標型別將針對空間進行最佳化,寬度至少為 16 位元。
long — 目標型別寬度至少為 32 位元。

long long — 目標型別寬度至少為 64 位元。
(C++11 起)

注意:與所有型別說明符一樣,允許任何順序:unsigned long long intlong 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_tsizeof 運算子結果的無正負號整數型別,也包括 sizeof... 運算子與 alignof 運算子(C++11 起)

延伸整數型別

延伸整數型別是由實作定義的。請注意,固定寬度整數型別通常是標準整數型別的別名。

(C++11 起)

[編輯] 布林型別

bool — 整數型別,能夠保存兩個值之一:truefalsesizeof(bool) 的值是由實作定義的,且可能不等於 1

[編輯] 字元型別

字元型別是用於字元表示的整數型別。

signed char — 用於帶正負號字元表示的型別。
unsigned char — 用於無正負號字元表示的型別。也用於檢視 物件表示(原始記憶體)。
char — 用於目標系統上能最有效處理的字元表示型別(其表示方式與對齊方式與 signed charunsigned char 相同,但始終是一個獨立的型別)。多位元組字元字串使用此型別來表示程式碼單元。對於範圍在 [0255] 內的每一個 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 上無法實現,因此被視為一個 缺陷 並已移除。

char16_t — 用於 UTF-16 字元表示的型別,要求足夠大以表示任何 UTF-16 程式碼單元(16 位元)。它具有與 std::uint_least16_t 相同的大小、帶正負號性與對齊方式,但是一個獨立的型別。

char32_t — 用於 UTF-32 字元表示的型別,要求足夠大以表示任何 UTF-32 程式碼單元(32 位元)。它具有與 std::uint_least32_t 相同的大小、帶正負號性與對齊方式,但是一個獨立的型別。
(C++11 起)

char8_t — 用於 UTF-8 字元表示的型別,要求足夠大以表示任何 UTF-8 程式碼單元(8 位元)。它具有與 unsigned char 相同的大小、帶正負號性與對齊方式(因此,也與 charsigned char 具有相同大小與對齊方式),但是一個獨立的型別。
(自 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 強制規定的型別。

延伸浮點型別

延伸浮點型別是由實作定義的。它們可能包含 固定寬度浮點型別

(自 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 位元帶正負號型別為 −127127),這對應於 一補數符號與大小 表示法的限制。

然而,所有 C++ 編譯器都使用 二補數 (two's complement) 表示法,且自 C++20 起,這是標準允許的唯一表示法,保證範圍從 -2N-1
+2N-1
-1
(例如對於 8 位元帶正負號型別為 −128127)。

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 −128127
unsigned 0255
16 UTF-16 065535
32 UTF-32 01114111 (0x10ffff)
整數 16 signed ± 3.27 · 104 −3276832767
unsigned 06.55 · 104 065535
32 signed ± 2.14 · 109 −2,147,483,6482,147,483,647
unsigned 04.29 · 109 04,294,967,295
64 signed ± 9.22 · 1018 −9,223,372,036,854,775,8089,223,372,036,854,775,807
unsigned 01.84 · 1019 018,446,744,073,709,551,615
binary
浮點
32 IEEE-754
  • 最小次常規值
    ± 1.401,298,4 · 10−45
  • 最小常規值
    ± 1.175,494,3 · 10−38
  • max
    ± 3.402,823,4 · 1038
  • 最小次常規值
    ±0x1p−149
  • 最小常規值
    ±0x1p−126
  • max
    ±0x1.fffffep+127
64 IEEE-754
  • 最小次常規值
    ± 4.940,656,458,412 · 10−324
  • 最小常規值
    ± 2.225,073,858,507,201,4 · 10−308
  • max
    ± 1.797,693,134,862,315,7 · 10308
  • 最小次常規值
    ±0x1p−1074
  • 最小常規值
    ±0x1p−1022
  • max
    ±0x1.fffffffffffffp+1023
80[註 1] x86
  • 最小次常規值
    ± 3.645,199,531,882,474,602,528
     · 10−4951
  • 最小常規值
    ± 3.362,103,143,112,093,506,263
     · 10−4932
  • max
    ± 1.189,731,495,357,231,765,021
     · 104932
  • 最小次常規值
    ±0x1p−16445
  • 最小常規值
    ±0x1p−16382
  • max
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • 最小次常規值
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10−4966
  • 最小常規值
    ± 3.362,103,143,112,093,506,262,
    677,817,321,752,602,6 · 10−4932
  • max
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 104932
  • 最小次常規值
    ±0x1p−16494
  • 最小常規值
    ±0x1p−16382
  • max
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
  1. 物件表示在 32/64 位元平台上通常分別佔用 96/128 位元。

注意:這些型別可表示數值的實際(而非保證的最小)限制可在 C 數值限制介面std::numeric_limits 中找到。

[編輯] 資料模型

每個實作對基本型別大小所做的選擇統稱為 資料模型。四種資料模型已獲得廣泛採用

32 位元系統

  • LP322/4/4 (int 為 16 位元,long 與指標為 32 位元)
  • Win16 API
  • ILP324/4/4 (intlong 與指標皆為 32 位元);
  • Win32 API
  • Unix 與類 Unix 系統 (Linux, macOS)

64 位元系統

  • LLP644/4/8 (intlong 為 32 位元,指標為 64 位元)
  • LP644/8/8 (int 為 32 位元,long 與指標為 64 位元)
  • Unix 與類 Unix 系統 (Linux, macOS)

其他模型非常罕見。例如,ILP64 (8/8/8intlong 與指標皆為 64 位元) 僅出現在一些早期的 64 位元 Unix 系統中(例如 Cray 上的 UNICOS)。

[編輯] 註解

功能測試巨集 數值 標準 功能
__cpp_unicode_characters 200704L (C++11) 新字元型別 (char16_tchar32_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 說明文件算術型別

English Deutsch 日本語 中文(简体) 中文(繁體)