K&C給出了7個與類型相關的關鍵字。C90標準添加了2個關鍵字,C99標準又添加了3個關鍵字。函數
K&C給出的關鍵字 | C90標準添加的關鍵字 | C99標準添加的關鍵字 |
int | signed | _Bool |
long | void | _Complex |
short | _Imaginary | |
unsigned | ||
char | ||
float | ||
double |
在C語言中,用int關鍵字來表示基本的整數類型。後3個關鍵字(long,short和unsigned)和C90新增的signed用於提供基本整數類型的變式,例如unsigned short int 和 long long int。char關鍵字用於指定字母和其餘字符(如,#,¥,%和*)。另外,char類型也能夠表示較小的整數。float,double和long double表示帶小數點的數。_Bool類型表示布爾值(true或false),_Complex和_Imaginary分別表示複數和虛數。編碼
按計算機的存儲方式可分爲兩大基本類型:整數類型和浮點數類型。spa
int類型是有符號整型,即int類型的值必須是整數,能夠是正整數,負整數或零。其取值範圍依計算機系統而異。通常而言,儲存一個int要佔用一個機器字長。所以,早期的16位IBM PC兼容機使用16位來儲存一個int值,其取值範圍是 -32768~32767。目前的我的計算機通常是32位,所以用32位儲存一個int值。code
1 #include <stdio.h> 2 void main(void){ 3 4 int ten = 10; 5 int two = 2; 6 7 printf("Doing it right: "); 8 printf("%d minus %d is %d\n",ten,2,ten-two); 9 printf("Doing it wrong: "); 10 printf("%d minus %d is %d\n",ten); 11 12 getchar(); 13 }
可使用printf()函數打印int類型的值。%d指明瞭在一行中打印整數的位置。%d成爲轉換說明,他指定了printf()應使用什麼格式來顯示一個值。格式化字符串中的每一個%d都與待打印變量列表中相應的int值匹配。blog
在C程序中,既可使用也能夠顯示不一樣進制的數。不一樣的進制要使用不一樣的轉換說明。以十進制顯示數字,使用%d;以八進制顯示數字,使用%o;以十六進制顯示數字,使用%x。另外,要顯示各進制數的前綴0、0x和0X,必須分別使用%#o、%#x,%#X。ip
1 #include <stdio.h> 2 void main(void){ 3 4 int x = 100; 5 6 printf("dec = %d;octal = %o;hex = %x\n",x,x,x); 7 printf("dec = %d;octal = %#o;hex = %#x\n",x,x,x); 8 9 10 getchar(); 11 }
輸出結果:
dec = 100;octal = 144;hex = 64 dec = 100;octal = 0144;hex = 0x64
C語言提供3個附屬關鍵字修飾基本整數類型:short,long,和unsigned。應記住如下幾點:ci
使用多種整數類型的緣由:字符串
爲何說short類型「可能」比int類型佔用的空間少,long類型「可能」比int類型佔用的空間多?由於C語言只規定了short佔用的空間很少於int,long佔用的存儲空間不能少於int。這樣規定是爲了適應不一樣的機器。get
如今,我的計算機上最多見的設置是,long long佔64位,long佔32位,short佔16位,int佔16位或32位(依計算機的天然字長而定)。原則上,這4種類型表明4種不一樣的大小,可是在實際使用中,有些類型之間一般有重疊。編譯器
一般,程序代碼中使用的數字都儲存爲int類型。若是超出int類型能表示的範圍,編譯器會將其視爲long int類型。若是數字超出long可表示的最大值,編譯器則將其視爲unsigned long類型,若是還不夠大,則將其視爲long long或unsigned long long類型。
有些狀況下,須要編譯器以long類型儲存一個小數字。例如一些C標準函數要求使用long類型的值。要把一個較小的常量做爲long類型對待,能夠在值得末尾加上l(小寫的L)或L後綴。建議使用L。所以,在int爲16位,long爲32位的系統中,會把7做爲16位儲存,把7L做爲32位儲存。
相似的,在支持long long類型的系統中,也可使用LL後綴來表示long long類型的值,如3LL。另外,u或U後綴表示unsigned long long,如5ull,10ULL等。
打印unsigned int類型的值,使用%u轉換說明;打印long類型的值,使用%ld轉換說明。在x和o前面可使用l前綴,%lx表示以十六進制格式打印long類型整數,%lo表示以八進制格式打印long類型。注意,雖然C容許使用大寫或小寫的常量後綴,可是在轉換說明中只能是小寫、
C語言有多種printf()格式。對於short類型,可使用h前綴。%hd表示以十進制顯示short類型的整數,%hd表示以八進制顯示short類型的整數。h和前綴均可以和u一塊兒使用,用於表示無符號類型。例如,%lu表示打印unsigned long類型的值。
char類型用於儲存字符(如,字母或標點符號),可是從技術層面看,char是整數類型。由於char類型實際上儲存的是整數而不是字符。計算機使用數字編碼來處理字符,即用特定的整數表示特定的字符。
C語言把1字節定義爲char類型佔用的位(bit)數,所以不管是16位仍是32位系統,均可以使用char類型。
printf()函數用%c指明待打印的字符。
C99標準添加了_Bool類型,用於表示布爾值,即邏輯值true和false。由於C語言用值1表示true,值0表示false,因此_Bool類型實際上也是一種整數類型。可是原則上它僅佔用1位存儲空間。
C語言提供了許多有用的整數類型。可是,某些類型名在不一樣系統中的功能不同。C99新增了兩個頭文件stdint.h和inttypes.h,以確保C語言的類型在各系統中的功能相同。(瞭解便可)
默認狀況下,編譯器假定浮點型常量是double類型的精度。
在浮點數後面加上f或F後綴可覆蓋默認設置,編譯器會將浮點型常量看做float類型。使用l或L後綴使得數字成爲long double類型。
C99標準添加了一種新的浮點型常量格式——用十六進制表示浮點型常量,即在十六進制數前加上十六進制前綴(0x或0X),用p和P分別代替e和E,用2的冪代替10的冪。(即,p計數法)
例如:0xa.1fp+10 【十六進制a等於十進制10,.1f是1/16加上15/256,p+10是2^10或1024。0xa.1fp+10表示的值是(10+1/16+15/256)* 1024(即十進制10364.0)】
注意,並不是全部的編譯器都支持C99的這一特性
printf()函數使用%f轉換說明打印十進制計數法的float和double類型浮點數,用%e打印指數計數法的浮點數。若是系統支持十六進制格式的浮點數,可用a和A分別代替e和E。使用long double類型要使用%Lf、%Le、%La轉換說明。
1 #include <stdio.h> 2 void main(void){ 3 float aboat = 32000.0; 4 double abet = 2.14e9; 5 long double dip = 5.32e-5; 6 7 printf("%f can be written %e\n",aboat,aboat); 8 printf("And it's %a in hexadecimal powers of 2 notation\n",aboat); 9 printf("%f can be written %e\n",abet,abet); 10 printf("%Lf can be written %Le\n",dip,dip); 11 12 getchar(); 13 14 }
如何知道當前系統的指定類型的大小是多少?
#include <stdio.h> void main(void){ printf("Type int has a size of %d bytes.\n",sizeof(int)); printf("Type char has a size of %d bytes.\n",sizeof(char)); printf("Type long has a size of %d bytes.\n",sizeof(long)); printf("Type short has a size of %d bytes.\n",sizeof(short)); printf("Type float has a size of %d bytes.\n",sizeof(float)); printf("Type double has a size of %d bytes.\n",sizeof(double)); printf("Type long double has a size of %d bytes.\n",sizeof(long double)); getchar(); }