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