名稱空間
變體
操作

基本型別

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
 
 

(另請參閱 型別 獲取型別系統概述,以及 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 的型別。它是一個不同於指標型別或指向成員指標型別的獨立型別。它的所有純右值都是 空指標常量

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 具有相同的表示和對齊方式,但始終是不同的型別)。多位元組字串使用此型別表示程式碼單元。對於 unsigned char 型別在範圍 [0255] 中的每個值,將該值轉換為 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)

注:這允許極端情況,即 位元組 大小為 64 位,所有型別(包括 char)寬度為 64 位,並且 sizeof 對所有型別都返回 1

[編輯] 浮點型別

[編輯] 標準浮點型別

以下三種類型及其 cv 限定版本統稱為標準浮點型別。

float — 單精度浮點型別。通常為 IEEE-754 binary32 格式
double — 雙精度浮點型別。通常為 IEEE-754 binary64 格式
long double — 擴充套件精度浮點型別。不一定對映到 IEEE-754 規定的型別。

擴充套件浮點型別

擴充套件浮點型別是實現定義的。它們可能包括固定寬度浮點型別

(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 位有符號型別,為 −127127),這對應於補碼符號-大小的限制。

然而,所有 C++ 編譯器都使用 二進位制補碼 表示,並且從 C++20 開始,它是標準唯一允許的表示,保證範圍從 -2N-1
+2N-1
-1
(例如,對於有符號 8 位型別,範圍為 −128127)。

自 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 −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
二進位制
浮點型
浮點
32 IEEE-754
  • 最小非規範數
    ± 1.401,298,4 · 10−45
  • 最小規範數
    ± 1.175,494,3 · 10−38
  • 最大值
    ± 3.402,823,4 · 1038
  • 最小非規範數
    ±0x1p−149
  • 最小規範數
    ±0x1p−126
  • 最大值
    ±0x1.fffffep+127
64 IEEE-754
  • 最小非規範數
    ± 4.940,656,458,412 · 10−324
  • 最小規範數
    ± 2.225,073,858,507,201,4 · 10−308
  • 最大值
    ± 1.797,693,134,862,315,7 · 10308
  • 最小非規範數
    ±0x1p−1074
  • 最小規範數
    ±0x1p−1022
  • 最大值
    ±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
  • 最大值
    ± 1.189,731,495,357,231,765,021
     · 104932
  • 最小非規範數
    ±0x1p−16445
  • 最小規範數
    ±0x1p−16382
  • 最大值
    ±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
  • 最大值
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 104932
  • 最小非規範數
    ±0x1p−16494
  • 最小規範數
    ±0x1p−16382
  • 最大值
    ±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)

其他模型非常罕見。例如,ILP648/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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
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 文件 算術型別

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