C語言 — 基本數據類型

1.1 數據:數據類型關鍵字

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

1.2 int類型

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

1.2.2 顯示八進制和十六進制

在C程序中,既可使用也能夠顯示不一樣進制的數。不一樣的進制要使用不一樣的轉換說明。以十進制顯示數字,使用%d;以八進制顯示數字,使用%o;以十六進制顯示數字,使用%x。另外,要顯示各進制數的前綴0、0x和0X,必須分別使用%#o、%#x,%#Xip

 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

1.2.3 其餘整數類型

C語言提供3個附屬關鍵字修飾基本整數類型:short,long,和unsigned。應記住如下幾點:ci

  • short int類型(簡寫short)佔用的空間可能比int類型少,經常使用與較小數值的場合以節省空間。
  • long int或long佔用的存儲空間可能比int多,適用於較大數值的場合。
  • long long int或long long(C99標準加入)佔用的儲存空間可能比long多,適用於更大數值的場合。該類型至少佔64位。
  • unsigned int 或unsigned只用於非負值得場合。用於表示正負號的位如今用於表示另外一個二進制位,因此無符號整型能夠表示更大的數。
  • 在C90標準中,添加了unsigned long int或unsigned long和unsigned short int或unsigned short類型。C99標準又添加了unsigned long long int 或unsigned long long

使用多種整數類型的緣由:字符串

爲何說short類型「可能」比int類型佔用的空間少,long類型「可能」比int類型佔用的空間多?由於C語言只規定了short佔用的空間很少於int,long佔用的存儲空間不能少於int。這樣規定是爲了適應不一樣的機器。get

如今,我的計算機上最多見的設置是,long long佔64位,long佔32位,short佔16位,int佔16位或32位(依計算機的天然字長而定)。原則上,這4種類型表明4種不一樣的大小,可是在實際使用中,有些類型之間一般有重疊。編譯器

1.2.4 long常量和long long常量

一般,程序代碼中使用的數字都儲存爲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等。

1.2.5 打印short、long、long long和unsigned類型

打印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類型的值。

1.3 使用字符:char類型

char類型用於儲存字符(如,字母或標點符號),可是從技術層面看,char是整數類型。由於char類型實際上儲存的是整數而不是字符。計算機使用數字編碼來處理字符,即用特定的整數表示特定的字符。

C語言把1字節定義爲char類型佔用的位(bit)數,所以不管是16位仍是32位系統,均可以使用char類型。

1.3.1 打印字符

printf()函數用%c指明待打印的字符。

1.4 _Bool類型

C99標準添加了_Bool類型,用於表示布爾值,即邏輯值true和false。由於C語言用值1表示true,值0表示false,因此_Bool類型實際上也是一種整數類型。可是原則上它僅佔用1位存儲空間。

1.5 可移植類型:stdint.h和inttypes.h

C語言提供了許多有用的整數類型。可是,某些類型名在不一樣系統中的功能不同。C99新增了兩個頭文件stdint.h和inttypes.h,以確保C語言的類型在各系統中的功能相同。(瞭解便可)

1.6 float,double和long double

默認狀況下,編譯器假定浮點型常量是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的這一特性

1.6.2打印浮點值

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 }

1.6.3 浮點值的上溢和下溢(暫略)

1.7 複數和虛數(跳過)

1.8 類型大小

如何知道當前系統的指定類型的大小是多少?

#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();
}
相關文章
相關標籤/搜索