天天看點

c語言cis,Arithmetic types

(另請參閱類型系統概述的類型以及由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(哪一個是實作定義的,并且可以由編譯器指令行開關控制),但是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,實作模運算的未簽名對應方。适用于位操作。

long int(也可以通路long)

unsigned long int(也可以通路unsigned long)

這是該平台的最佳整數類型,并且保證至少為16位。大多數目前系統使用32位(請參見下面的資料模型)。

long long int(也可以通路long long)

unsigned long long int(也可以通路unsigned long long)

(since C99)

注意:與所有類型說明符一樣,任何次序都是允許的:unsigned long long int與long int unsigned long命名相同的類型。

下表總結了所有可用的整數類型及其屬性:

類型說明符等效類型資料模型的位寬C标準LP32ILP32LLP64LP64

短短整型至少為1616161616

除了最小的位數外,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位長,指針是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位長,指針是64位)Unix和類Unix系統(Linux,Mac OS X)

其他型号非常少見。例如,ILP64(8/8/8:int,long和指針是64位)僅出現在一些早期的64位Unix系統中(例如Cray上的Unicos)。

請注意,自C99開始,精确寬度的整數類型在中可用。

真正的浮動類型

C有三種類型來表示實際的浮點值:

float - 單精度浮點型。如果支援,比對IEEE-754 32位浮點類型。

double - 雙精度浮點型。如果支援,比對IEEE-754 64位浮點類型

long double - 擴充精度浮點類型。如果支援,則比對IEEE-754擴充浮點類型,否則比對某些非标準擴充浮點類型,隻要其精度優于double且範圍至少與double一緻,否則比對類型double。一些x86和x86_64實作使用80位x87浮點類型。

浮點類型可能支援特殊值:

無限(正面和負面),見INFINITY

負零,-0.0。它類似于正零,但在一些算術運算中有意義,例如1.0/0.0 == INFINITY而非1.0/-0.0 == -INFINITY)

非數字(NaN),它與任何其他内容(包括它本身)都不相等。多位模式表示NaN的,參閱nan,NAN。請注意,C沒有特别注意發送NaN(由IEEE-754指定),并将所有NaN視為靜态。

實數浮點數可能與算術運算符+  -  / *和math.h中的各種數學函數一起使用。内置運算符和庫函數都可能會引發浮點異常且errno按照math_errhandling中所述進行設定。

請參閱,浮點表達式的範圍和精度可能比其類型所訓示的範圍和精度要高于FLT_EVAL_METHOD。指派,傳回和強制将範圍和精度強制為與聲明類型關聯的範圍和精度。

浮點表達式也可能會收縮,就像所有中間值具有無限範圍和精度一樣計算,請參閱#pragma STDC FP_CONTRACT。

浮點數的一些操作受浮點環境的狀态(最顯着的是舍入方向)的影響和修改。

隐式轉換定義在實際浮點類型與整數,複數和虛數類型之間。

有關浮點類型的其他詳細資訊,限制和屬性,請參閱浮點類型的限制和math.h庫。

複雜的浮動類型

複數浮點類型對數學複數進行模組化,即可以寫成實數和實數乘以虛數機關的和的數字:a + bi

三種複雜類型是

float _Complex(也可以像float complex包含一樣使用)

double _Complex(也可以像double complex包含一樣使用)

long double _Complex(也可以像long double complex包含一樣使用)

注意:與所有類型說明符一樣,可以使用任何順序:long double complex,complex long double甚至double complex long命名相同的類型。

運作此代碼#include #include 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)由實作定義,則不提供複雜類型(以及庫标題)。(自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中為複數定義了許多數學函數。内置運算符和庫函數都可能會引發浮點異常并errno按照math_errhandling中所述進行設定。

沒有為複雜類型定義增量和減量。

沒有為複雜類型定義關系運算符(沒有“小于”的概念)在複雜類型和其他算術類型之間定義隐式轉換。

為了支援複數運算的單一無窮大模型,C 将具有至少一個無限部分的任何複數值視為無窮大,即使其另一部分是 NaN,也保證所有運算符和函數都遵守入口的基本屬性并提供cproj将所有無窮大映射到規範的一個(請參閱算術運算符以了解确切的規則)。

運作此代碼#include #include #include 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包含一樣使用)

double _Imaginary(也可以像double imaginary包含一樣使用)

long double _Imaginary(也可以像long double imaginary包含一樣使用)

注意:與所有類型說明符一樣,可以使用任何順序:long double imaginary,imaginary long double甚至double imaginary long命名相同的類型。

#include #include 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中為虛數定義了許多數學函數。内置運算符和庫函數都可能會引發浮點異常并errno按照中所述進行設定math_errhandling。

沒有為虛數類型定義增量和減量隐式轉換是在虛數類型和其他算術類型之間定義的。

虛數使得使用自然符号表示所有複數x + I*y(它I被定義為_Imaginary_I)成為可能。沒有虛構的類型,某些特殊的複雜值不能自然建立。例如,如果I定義為_Complex_I,則寫入0.0 + I*INFINITY将 NaN 作為實部,并且CMPLX(0.0, INFINITY)必須使用 NaN 。具有負零虛數分量的數字也是如此,當使用分支切分處理庫函數時這些數字是有意義的,例如csqrt:1.0 - 0.0*I如果I定義為正零零虛數分量,_Complex_I并且負零虛數部分需要使用CMPLX或conj。

虛構類型也簡化了實作; 如果虛數類型得到支援,則可以用兩次乘法直接實作虛數與複數的乘法,而不是四次乘法和兩次加法。

(since C99)

關鍵詞

char, int, short, long, signed, unsigned, float, double. _Bool, _Complex, _Imaginary.

值的範圍

下表提供了常用數字表示限制的參考。由于 C 标準允許任何帶符号的整數表示,是以該表給出了最小保證需求(對應于補碼的限制或符号和幅度)以及最常用的實作的限制,即二進制補碼。不過,所有流行的資料模型(包括 ILP32,LP32,LP64,LLP64)都使用二進制補碼表示法。

類型大小以位為機關格式值範圍近似精确值

字元8signed (補充)-127至127

signed (二補)-128至127

無符号0到255

積分16signed (補充)± 3.27 · 104-32767至32767

signed (二補)-32768至32767

無符号0至6.55·1040至65535

32signed (補充)± 2.14 · 109-2,147,483,647至2,147,483,647

signed (二補)-2,147,483,648至2,147,483,647

無符号0至4.29·1090至4,294,967,295

64signed (補充)± 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

unsigned0到1.84·10190至18,446,744,073,709,551,615

浮點32IEEE-754±3.4·10±38(〜7位)min低于正常值:±1.401,298,4·10-47分鐘正常值:±1.175,494.3·10-38最高值:±3.402,823,4.1038

64IEEE-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

注意:庫頭檔案和中提供了實際的(而不是保證的最小值)範圍