算術型別
(另請參見型別獲取型別系統概述,以及C標準庫提供的與型別相關的實用程式列表。)
布林型別請注意,轉換為_Bool(直至 C23)bool(自 C23 起)與轉換為其他整數型別的方式不同:(bool)0.5求值為true,而(int)0.5求值為0。 |
(C99 起) |
[編輯] 字元型別
- signed char — 用於有符號字元表示的型別。
- unsigned char — 用於無符號字元表示的型別。也用於檢查物件表示(原始記憶體)。
- char — 用於字元表示的型別。等同於signed char或unsigned char(具體是哪一個由實現定義,並可能由編譯器命令列開關控制),但char是一個不同的型別,與signed char和unsigned char都不同。
請注意,標準庫還定義了typedef名稱wchar_t、char16_t和char32_t(自 C11 起)來表示寬字元以及char8_t表示UTF-8字元(自 C23 起)。
[編輯] 整數型別
- short int (也可訪問為short, 可使用關鍵詞signed)
- unsigned short int (也可訪問為unsigned short)
- int (也可訪問為signed int)
- 這是平臺上最優的整數型別,並保證至少為16位。大多數當前系統使用32位(見下文資料模型)。
- unsigned int (也可訪問為unsigned),是int的無符號對應型別,實現模算術。適用於位操作。
- long int (也可訪問為long)
- unsigned long int (也可訪問為unsigned long)
|
(C99 起) |
|
(自 C23 起) |
注意:與所有型別說明符一樣,任何順序都是允許的:unsigned long long int和long int unsigned long指代相同的型別。
下表總結了所有可用的整數型別及其屬性
型別說明符 | 等效型別 | 資料模型下的位寬 | ||||
---|---|---|---|---|---|---|
C 標準 | LP32 | ILP32 | LLP64 | LP64 | ||
char
|
char | 至少 8 |
8 | 8 | 8 | 8 |
signed char
|
signed char | |||||
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 (C99) |
至少 64 |
64 | 64 | 64 | 64 |
long long int
| ||||||
signed long long
| ||||||
signed long long int
| ||||||
unsigned long long
|
unsigned long long int (C99) | |||||
unsigned long long int
|
除了最小位數外,C 標準還保證
- 1 == sizeof(char)
≤
sizeof(short)≤
sizeof(int)≤
sizeof(long)≤
sizeof(long long)。
注意:這允許極端情況,即位元組大小為64位,所有型別(包括char)都為64位寬,且sizeof對每種型別都返回1。
注意:有符號和無符號整數型別的整數算術定義不同。請參閱算術運算子,特別是整數溢位。
[編輯] 資料模型
每個實現對基本型別大小的選擇統稱為“資料模型”。四種資料模型獲得廣泛接受
32位系統
- LP32 或 2/4/4 (int 為 16 位,long 和指標為 32 位)
- Win16 API
- ILP32 或 4/4/4 (int、long 和指標為 32 位);
- Win32 API
- Unix 和類 Unix 系統 (Linux, Mac OS X)
64 位系統
- LLP64 或 4/4/8 (int 和 long 為 32 位,指標為 64 位)
- Win64 API
- LP64 或 4/8/8 (int 為 32 位,long 和指標為 64 位)
- Unix 和類 Unix 系統 (Linux, Mac OS X)
其他模型非常罕見。例如,ILP64(8/8/8:int、long和指標均為64位)僅出現在一些早期64位Unix系統(例如Cray上的Unicos)中。
請注意,自 C99 起,<stdint.h> 中提供了精確寬度的整數型別。
[編輯] 實浮點型別
C有三個或六個(自 C23 起)型別用於表示實浮點值
- float — 單精度浮點型別。如果支援,匹配IEEE-754 binary32 格式。
- double — 雙精度浮點型別。如果支援,匹配IEEE-754 binary64 格式。
- long double — 擴充套件精度浮點型別。如果支援,匹配IEEE-754 binary128 格式;否則,如果支援,匹配IEEE-754 binary64 擴充套件格式;否則,匹配某些非IEEE-754 擴充套件浮點格式,只要其精度優於binary64且範圍至少與binary64相同;否則,匹配IEEE-754 binary64 格式。
- 某些HP-UX、SPARC、MIPS、ARM64和z/OS實現使用binary128格式。
- 最著名的IEEE-754 binary64擴充套件格式是80位x87擴充套件精度格式。它被許多x86和x86-64實現使用(一個顯著的例外是MSVC,它以與double相同的格式(即binary64)實現long double)。
|
(自 C23 起) |
浮點型別可能支援特殊值
- 無窮大(正和負),參見INFINITY
- 負零,-0.0。它與正零比較相等,但在某些算術運算中具有意義,例如1.0 / 0.0 == INFINITY,但1.0 / -0.0 == -INFINITY)
- 非數值 (NaN),它不與任何值(包括自身)比較相等。多個位模式表示NaN,參見nan,NAN。請注意,C不特別關注信令NaN(由IEEE-754指定),並將所有NaN視為安靜NaN。
實浮點數可與算術運算子+
-
/
*
以及<math.h>中的各種數學函式一起使用。內建運算子和庫函式都可能引發浮點異常並設定errno,如math_errhandling所述。
浮點表示式可能具有比其型別指示的更大的範圍和精度,請參見FLT_EVAL_METHOD。賦值、返回和強制轉換會強制範圍和精度與宣告的型別關聯。
浮點表示式也可以被“收縮”(contracted),即,計算時假設所有中間值都具有無限範圍和精度,參見#pragma STDC FP_CONTRACT。
對浮點數的一些操作會受浮點環境狀態的影響並修改其狀態(最顯著的是舍入方向)。
實浮點型別與整數、複數和虛數型別之間定義了隱式轉換。
有關浮點型別的更多詳細資訊、限制和屬性,請參閱浮點型別的限制和<math.h>庫。
復浮點型別復浮點型別模擬數學上的複數,即可以寫成實數和乘以虛數單位的實數之和的數:a + bi 這三種複數型別是
注意:與所有型別說明符一樣,任何順序都是允許的:long double complex、complex long double,甚至double complex long都指代相同的型別。 執行此程式碼 輸出 1/(1.0+2.0i) = 0.2-0.4i
每個複數型別都具有與其對應的實數型別(float 對應於 float complex,double 對應於 double complex,long double 對應於 long double complex)的兩個元素陣列相同的物件表示和對齊要求。陣列的第一個元素包含實部,第二個元素包含虛部。 複數可與算術運算子 增量和減量未定義用於複數型別。 關係運算符未定義用於複數型別(沒有“小於”的概念)。
為了支援複數算術的單無窮大模型,C 將任何至少含有一個無窮大部分的複數視為無窮大,即使其另一部分是 NaN;它保證所有運算子和函式都遵守無窮大的基本屬性,並提供cproj 將所有無窮大對映到規範的無窮大(有關精確規則,請參閱算術運算子)。 執行此程式碼 #include <complex.h> #include <math.h> #include <stdio.h> int main(void) { double complex z = (1 + 0*I) * (INFINITY + I*INFINITY); // textbook formula would give // (1+i0)(∞+i∞) ⇒ (1×∞ – 0×∞) + i(0×∞+1×∞) ⇒ NaN + I*NaN // but C gives a complex infinity printf("%f%+f*i\n", creal(z), cimag(z)); // textbook formula would give // cexp(∞+iNaN) ⇒ exp(∞)×(cis(NaN)) ⇒ NaN + I*NaN // but C gives ±∞+i*nan double complex y = cexp(INFINITY + I*NAN); printf("%f%+f*i\n", creal(y), cimag(y)); } 可能的輸出 inf+inf*i inf+nan*i C 還處理多個無窮大,以便在可能的情況下保留方向資訊,儘管笛卡爾表示法固有侷限性 將虛數單位乘以實無窮大得到正確符號的虛無窮大:i × ∞ = i∞。另外,i × (∞ – i∞) = ∞ + i∞ 指示合理的象限。
虛浮點型別虛浮點型別模擬數學上的虛數,即可以寫成實數乘以虛數單位的數:bi這三種虛數型別是
注意:與所有型別說明符一樣,任何順序都是允許的:long double imaginary、imaginary long double,甚至double imaginary long都指代相同的型別。 執行此程式碼 輸出 1/(3.0i) = -0.3i
這三種虛數型別中的每一種都具有與其對應的實數型別(float 對應 float imaginary,double 對應 double imaginary,long double 對應 long double imaginary)相同的物件表示和對齊要求。 注意:儘管如此,虛數型別是不同的,並且與其對應的實數型別不相容,這禁止了別名。 虛數可與算術運算子 增量和減量未定義用於虛數型別。
虛數使得使用自然表示法x + I*y(其中I定義為_Imaginary_I)來表示所有複數成為可能。如果沒有虛數型別,某些特殊的複數值就無法自然地建立。例如,如果I定義為_Complex_I,那麼編寫0.0 + I*INFINITY會導致實部為NaN,而必須使用CMPLX(0.0, INFINITY)。對於具有負零虛部的數字也是如此,這在使用帶分支切割的庫函式(例如csqrt)時是有意義的:如果I定義為_Complex_I,則1.0 - 0.0*I會產生正零虛部,而負零虛部需要使用CMPLX或conj。 虛數型別還簡化了實現;如果支援虛數型別,虛數與複數的乘法可以直觀地透過兩次乘法實現,而不是四次乘法和兩次加法。 |
(C99 起) |
[編輯] 關鍵詞
- bool, true, false, char, int, short, long, signed, unsigned, float, double。
- _Bool, _BitInt, _Complex, _Imaginary, _Decimal32, _Decimal64, _Decimal128。
[編輯] 值範圍
下表提供了常見數值表示的限制參考。
在C23之前,C標準允許任何有符號整數表示,並且N位有符號整數的最小保證範圍是從-(2N-1
-1)到+2N-1
-1(例如,8位有符號型別為-127到127),這對應於反碼或符號和幅度的限制。
然而,所有流行的資料模型(包括所有ILP32、LP32、LP64、LLP64)和幾乎所有C編譯器都使用二進位制補碼表示(唯一已知的例外是一些UNISYS編譯器),並且自C23起,它是標準允許的唯一表示,保證範圍從-2N-1
到+2N-1
-1(例如,8位有符號型別為-128到127)。
型別 | 位大小 | 格式 | 值範圍 | |
---|---|---|---|---|
大約 | 精確 | |||
字元 | 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 | IEEE-754 |
| |
64 | IEEE-754 |
| ||
128 | IEEE-754 |
|
- ↑ 物件表示通常在32/64位平臺上分別佔用96/128位。
注意:實際(而非保證最小)範圍可在庫標頭檔案<limits.h>和<float.h>中獲得。
[編輯] 參見
C++ 文件,關於基本型別
|