?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
(另請(qǐng)參閱類型系統(tǒng)概述的類型以及由C庫(kù)提供的與類型相關(guān)的實(shí)用程序的列表)。
_Bool
(也可以作為宏布爾) - 類型,能夠保存兩個(gè)值之一:1和0(也可以通過宏來訪問true和false)。
請(qǐng)注意,conversion to _Bool與轉(zhuǎn)換為其他整數(shù)類型的轉(zhuǎn)換不同:(bool)0.5
評(píng)估為1
,而(int)0.5
評(píng)估為0
。
(since C99)
signed char
- 輸入有符號(hào)字符表示。
unsigned char
- 輸入無(wú)符號(hào)字符表示。還用于檢查對(duì)象表示(原始內(nèi)存)。
char
- 字符表示的類型。等同于signed char
或者unsigned char
(哪一個(gè)是實(shí)現(xiàn)定義的,并且可以由編譯器命令行開關(guān)控制),但是char
是不同的類型,不同于signed char
兩者unsigned char
請(qǐng)注意,標(biāo)準(zhǔn)庫(kù)還定義了用于表示寬字符的typedef名稱wchar_t,char16_t和char32_t(自C11起)。
short int
(也可以訪問short
,可以使用關(guān)鍵字signed
)
unsigned short int
(也可以訪問unsigned short
)
int
(也可以訪問signed int
)
unsigned int
(也可以訪問unsigned
)int
,實(shí)現(xiàn)模運(yùn)算的未簽名對(duì)應(yīng)方。適用于位操作。
long int
(也可以訪問long
)
unsigned long int
(也可以訪問unsigned long
)
這是該平臺(tái)的最佳整數(shù)類型,并且保證至少為16位。大多數(shù)當(dāng)前系統(tǒng)使用32位(請(qǐng)參見下面的數(shù)據(jù)模型)。
long long int
(也可以訪問long long
)
unsigned long long int
(也可以訪問unsigned long long
)
(since C99)
注意:與所有類型說明符一樣,任何次序都是允許的:unsigned long long int
與long int unsigned long
命名相同的類型。
下表總結(jié)了所有可用的整數(shù)類型及其屬性:
類型說明符 | 等效類型 | 數(shù)據(jù)模型的位寬 | ||||
---|---|---|---|---|---|---|
C標(biāo)準(zhǔn) | LP32 | ILP32 | LLP64 | LP64 | ||
短 | 短整型 | 至少為16 | 16 | 16 | 16 | 16 |
除了最小的位數(shù)外,C標(biāo)準(zhǔn)保證了: 1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
。
注意:這允許在極端情況下字節(jié)大小為64位,所有類型(包括char
)都是64位寬,并且sizeof
對(duì)于每種類型返回1。
注意:對(duì)于有符號(hào)和無(wú)符號(hào)整數(shù)類型,整數(shù)算術(shù)的定義是不同的。請(qǐng)參閱算術(shù)運(yùn)算符,特別是整數(shù)溢出。
每種實(shí)現(xiàn)對(duì)基本類型大小的選擇統(tǒng)稱為數(shù)據(jù)模型。四個(gè)數(shù)據(jù)模型被廣泛接受:
32位系統(tǒng):
LP32或2/4/4(int是16位長(zhǎng),指針是32位)
Win16 API
ILP32或4/4/4(int,long和指針是32位);
Win32 API
Unix和類Unix系統(tǒng)(Linux,Mac OS X)
64位系統(tǒng):
LLP64或4/4/8(int和long是32位,指針是64位)
Win64 API
LP64或4/8/8(int是32位長(zhǎng),指針是64位)
Unix和類Unix系統(tǒng)(Linux,Mac OS X)
其他型號(hào)非常少見。例如,ILP64(8/8/8:int,long和指針是64位)僅出現(xiàn)在一些早期的64位Unix系統(tǒng)中(例如Cray上的Unicos)。
請(qǐng)注意,自C99開始,精確寬度的整數(shù)類型在<stdint.h>中可用。
C有三種類型來表示實(shí)際的浮點(diǎn)值:
float
- 單精度浮點(diǎn)型。如果支持,匹配IEEE-754 32位浮點(diǎn)類型。
double
- 雙精度浮點(diǎn)型。如果支持,匹配IEEE-754 64位浮點(diǎn)類型
long double
- 擴(kuò)展精度浮點(diǎn)類型。如果支持,則匹配IEEE-754擴(kuò)展浮點(diǎn)類型,否則匹配某些非標(biāo)準(zhǔn)擴(kuò)展浮點(diǎn)類型,只要其精度優(yōu)于double
且范圍至少與double
一致,否則匹配類型double
。一些x86和x86_64實(shí)現(xiàn)使用80位x87浮點(diǎn)類型。
浮點(diǎn)類型可能支持特殊值:
無(wú)限(正面和負(fù)面),見INFINITY
負(fù)零,-0.0
。它類似于正零,但在一些算術(shù)運(yùn)算中有意義,例如1.0/0.0 == INFINITY
而非1.0/-0.0 == -INFINITY
)
非數(shù)字(NaN),它與任何其他內(nèi)容(包括它本身)都不相等。多位模式表示NaN的,參閱nan
,NAN
。請(qǐng)注意,C沒有特別注意發(fā)送NaN(由IEEE-754指定),并將所有NaN視為靜態(tài)。
實(shí)數(shù)浮點(diǎn)數(shù)可能與算術(shù)運(yùn)算符+ - / *和math.h中的各種數(shù)學(xué)函數(shù)一起使用。內(nèi)置運(yùn)算符和庫(kù)函數(shù)都可能會(huì)引發(fā)浮點(diǎn)異常且errno
按照math_errhandling
中所述進(jìn)行設(shè)置。
請(qǐng)參閱,浮點(diǎn)表達(dá)式的范圍和精度可能比其類型所指示的范圍和精度要高于FLT_EVAL_METHOD
。賦值,返回和強(qiáng)制將范圍和精度強(qiáng)制為與聲明類型關(guān)聯(lián)的范圍和精度。
浮點(diǎn)表達(dá)式也可能會(huì)收縮,就像所有中間值具有無(wú)限范圍和精度一樣計(jì)算,請(qǐng)參閱#pragma STDC FP_CONTRACT。
浮點(diǎn)數(shù)的一些操作受浮點(diǎn)環(huán)境的狀態(tài)(最顯著的是舍入方向)的影響和修改。
隱式轉(zhuǎn)換定義在實(shí)際浮點(diǎn)類型與整數(shù),復(fù)數(shù)和虛數(shù)類型之間。
有關(guān)浮點(diǎn)類型的其他詳細(xì)信息,限制和屬性,請(qǐng)參閱浮點(diǎn)類型的限制和math.h庫(kù)。
復(fù)數(shù)浮點(diǎn)類型對(duì)數(shù)學(xué)復(fù)數(shù)進(jìn)行建模,即可以寫成實(shí)數(shù)和實(shí)數(shù)乘以虛數(shù)單位的和的數(shù)字:a + bi
三種復(fù)雜類型是
float _Complex
(也可以像float
complex
包含<complex.h>一樣使用)
double _Complex
(也可以像double
complex
包含<complex.h>一樣使用)
long double _Complex
(也可以像long
double
complex
包含<complex.h>一樣使用)
注意:與所有類型說明符一樣,可以使用任何順序:long
double
complex
,complex
long
double
甚至double
complex
long
命名相同的類型。
運(yùn)行此代碼
#include <complex.h>#include <stdio.h>int main(void){ double complex z = 1 + 2*I; z = 1/z; printf("1/(1.0+2.0i) = %.1f%+.1fi\n", creal(z), cimag(z));}
輸出:
1/(1.0+2.0i) = 0.2-0.4i
如果宏常量__STDC_NO_COMPLEX__
(C11)由實(shí)現(xiàn)定義,<complex.h>
則不提供復(fù)雜類型(以及庫(kù)標(biāo)題)。(自C11以來)
每個(gè)復(fù)雜類型具有相同的對(duì)象表示和對(duì)準(zhǔn)要求作為一個(gè)陣列對(duì)應(yīng)的真實(shí)類型的兩個(gè)元件(的浮動(dòng)為float compelx,double為double complex,long double為long double complex)。數(shù)組的第一個(gè)元素保存實(shí)數(shù)部分,數(shù)組的第二個(gè)元素保存虛數(shù)部分。
float a[4] = {1, 2, 3, 4};float complex z1, z2;memcpy(&z1, a, sizeof z1); // z1 becomes 1.0 + 2.0imemcpy(&z2, a+2, sizeof z2); // z2 becomes 3.0 + 4.0i
復(fù)數(shù)可能與算術(shù)運(yùn)算符+ - 和*一起使用,可能與虛數(shù)和實(shí)數(shù)混合使用。在complex.h中為復(fù)數(shù)定義了許多數(shù)學(xué)函數(shù)。內(nèi)置運(yùn)算符和庫(kù)函數(shù)都可能會(huì)引發(fā)浮點(diǎn)異常并errno
按照math_errhandling
中所述進(jìn)行設(shè)置。
沒有為復(fù)雜類型定義增量和減量。
沒有為復(fù)雜類型定義關(guān)系運(yùn)算符(沒有“小于”的概念)在復(fù)雜類型和其他算術(shù)類型之間定義隱式轉(zhuǎn)換。
為了支持復(fù)數(shù)運(yùn)算的單一無(wú)窮大模型,C 將具有至少一個(gè)無(wú)限部分的任何復(fù)數(shù)值視為無(wú)窮大,即使其另一部分是 NaN,也保證所有運(yùn)算符和函數(shù)都遵守入口的基本屬性并提供cproj
將所有無(wú)窮大映射到規(guī)范的一個(gè)(請(qǐng)參閱算術(shù)運(yùn)算符以了解確切的規(guī)則)。
運(yùn)行此代碼
#include <stdio.h>#include <complex.h>#include <math.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 + i*%f\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 + i*%f\n", creal(y), cimag(y));
可能的輸出:
inf + i*inf inf + i*nan
C 盡管存在笛卡爾表示的內(nèi)在局限性,但它也可以處理多個(gè)無(wú)窮大,以盡可能地保留方向信息:
將虛數(shù)單位乘以實(shí)無(wú)窮大給出正確簽名的虛無(wú)限:i×∞=i∞。另外,i×(∞-i∞)=∞+i∞表示合理的象限。
虛浮點(diǎn)類型
虛浮點(diǎn)類型對(duì)數(shù)學(xué)虛數(shù)進(jìn)行建模,即可以寫成實(shí)數(shù)乘以虛數(shù)單位的數(shù)字:bi 三個(gè)虛構(gòu)類型。
float _Imaginary
(也可以像float
imaginary
包含<complex.h>一樣使用)
double _Imaginary
(也可以像double
imaginary
包含<complex.h>一樣使用)
long double _Imaginary
(也可以像long
double
imaginary
包含<complex.h>一樣使用)
注意:與所有類型說明符一樣,可以使用任何順序:long
double
imaginary
,imaginary
long
double
甚至double
imaginary
long
命名相同的類型。
#include <complex.h>#include <stdio.h>int main(void){ double imaginary z = 3*I; z = 1/z; printf("1/(3.0i) = %+.1fi\n", cimag(z));}
輸出:
1/(3.0i) = -0.3i
建議定義__STDC_IEC_559_COMPLEX__的編譯器,但不要求支持虛數(shù)。POSIX建議檢查宏_Imaginary_I是否被定義為標(biāo)識(shí)虛數(shù)支持。(自C99開始)(直到C11)
如果__STDC_IEC_559_COMPLEX__
定義了虛數(shù),則支持虛數(shù)。(自 C11開始)
三種虛構(gòu)類型中的每一種都具有與其對(duì)應(yīng)的真實(shí)類型(float
float
imaginary
,double
double
imaginary
,long double
long
double
imaginary
)相同的對(duì)象表示和對(duì)齊要求。
注意:盡管如此,虛構(gòu)類型是不同的,并且與它們相應(yīng)的真實(shí)類型不兼容,這就禁止了別名。
虛數(shù)可以與算術(shù)運(yùn)算符+ - 和*一起使用,可能與復(fù)數(shù)和實(shí)數(shù)混合使用。在complex.h中為虛數(shù)定義了許多數(shù)學(xué)函數(shù)。內(nèi)置運(yùn)算符和庫(kù)函數(shù)都可能會(huì)引發(fā)浮點(diǎn)異常并errno
按照中所述進(jìn)行設(shè)置math_errhandling
。
沒有為虛數(shù)類型定義增量和減量隱式轉(zhuǎn)換是在虛數(shù)類型和其他算術(shù)類型之間定義的。
虛數(shù)使得使用自然符號(hào)表示所有復(fù)數(shù)x + I*y
(它I
被定義為_Imaginary_I
)成為可能。沒有虛構(gòu)的類型,某些特殊的復(fù)雜值不能自然創(chuàng)建。例如,如果I
定義為_Complex_I
,則寫入0.0 + I*INFINITY
將 NaN 作為實(shí)部,并且CMPLX(0.0, INFINITY)
必須使用 NaN 。具有負(fù)零虛數(shù)分量的數(shù)字也是如此,當(dāng)使用分支切分處理庫(kù)函數(shù)時(shí)這些數(shù)字是有意義的,例如csqrt
:1.0 - 0.0*I
如果I
定義為正零零虛數(shù)分量,_Complex_I
并且負(fù)零虛數(shù)部分需要使用CMPLX
或conj
。
虛構(gòu)類型也簡(jiǎn)化了實(shí)現(xiàn); 如果虛數(shù)類型得到支持,則可以用兩次乘法直接實(shí)現(xiàn)虛數(shù)與復(fù)數(shù)的乘法,而不是四次乘法和兩次加法。
(since C99)
char
, int
, short
, long
, signed
, unsigned
, float
, double
. _Bool
, _Complex
, _Imaginary
.
下表提供了常用數(shù)字表示限制的參考。由于 C 標(biāo)準(zhǔn)允許任何帶符號(hào)的整數(shù)表示,因此該表給出了最小保證需求(對(duì)應(yīng)于補(bǔ)碼的限制或符號(hào)和幅度)以及最常用的實(shí)現(xiàn)的限制,即二進(jìn)制補(bǔ)碼。不過,所有流行的數(shù)據(jù)模型(包括 ILP32,LP32,LP64,LLP64)都使用二進(jìn)制補(bǔ)碼表示法。
類型 | 大小以位為單位 | 格式 | 值范圍 | |
---|---|---|---|---|
近似 | 精確值 | |||
字符 | 8 | signed (補(bǔ)充) | -127至127 | |
signed (二補(bǔ)) | -128至127 | |||
無(wú)符號(hào) | 0到255 | |||
積分 | 16 | signed (補(bǔ)充) | ± 3.27 · 104 | -32767至32767 |
signed (二補(bǔ)) | -32768至32767 | |||
無(wú)符號(hào) | 0至6.55·104 | 0至65535 | ||
32 | signed (補(bǔ)充) | ± 2.14 · 109 | -2,147,483,647至2,147,483,647 | |
signed (二補(bǔ)) | -2,147,483,648至2,147,483,647 | |||
無(wú)符號(hào) | 0至4.29·109 | 0至4,294,967,295 | ||
64 | signed (補(bǔ)充) | ± 9.22 · 1018 | -9,223,372,036,854,775,807至9,223,372,036,854,775,807 | |
signed (二補(bǔ)) | -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 | ||
浮點(diǎn) | 32 | IEEE-754 | ±3.4·10±38(?7位) | min低于正常值:±1.401,298,4·10-47分鐘正常值:±1.175,494.3·10-38最高值:±3.402,823,4.1038 |
64 | IEEE-754 | ±1.7·10±308(?15位) | min低于正常值:±4.940,656,458,412·10-324分鐘正常值:±2.225,073,858,507,201,4·10-308最大值:±1.797,693,134,862,315,7·10308 |
次正常:±1,401,298.4·10-47
分鐘正常值:±1.175,494.3·10-38
最大值:±3.402,823,4.1038
64 IEEE-754 **± 1.7 · 10± 308**
(~15 digits)
次正常分:±4,940,656,458,412·10-324
分鐘正常值:±2.225,073,858,507,201,4·10-308
最大:±1.797,693,134,862,315,7·10308
注意:庫(kù)頭文件<limits.h>和<float.h>中提供了實(shí)際的(而不是保證的最小值)范圍