一、整型int
1.1 概述
整數類型用來表示不同的取值范圍和正負值,含義和數學一樣,整數是沒有小數部分的值;
區分正負的類型,稱為有符類型(signed),無正負的類型(只有正值),稱為無符類型。 (unsigned);當聲明某變量類型為無符號類型時,需要在類型聲明前顯示使用unsigned;
1.2 int類型
short int 類型:簡寫short,C規定占用的空間不能多於int
long int 類型: 簡寫 long ,占用的空間可能比int多;
long long int 類型: 簡寫 long long 占用的空間可能比long多;
C標准對基本數據類型只規定了允許的最小大小,這樣占用空間的規定是為了適應不同的機器,int 默認被認為是計算機處理整數類型時最高效的類型;考慮某些硬件寄存器16位或者程序開發占用空間資源緊缺情況下,才考慮使用short,只有超出int類型表示的范圍才考慮long及long long類型;
1 //占用空間的大小 2 #include <stdio.h> 3 int main(void) 4 { 5 /* c99 provides a %zd specifier for sizes */ 6 printf("Type short has a size of %zd bytes.\n", sizeof(short)); 7 printf("Type int has a size of %zd bytes.\n", sizeof(int)); 8 printf("Type long has a size of %zd bytes.\n", sizeof(long)); 9 printf("Type long long has a size of %zd bytes.\n",sizeof(long long)); 10 return 0; 11 } 12 13 //Ubuntu16.04 64bit print: 14 Type short has a size of 2 bytes. 15 Type int has a size of 4 bytes. 16 Type long has a size of 8 bytes. 17 Type long long has a size of 8 bytes.
1.3 C語言中的轉換說明打印不同int類型
以十進制顯示輸出使用%d,
以八進制顯示輸出使用%o或%#o(在數字前面顯示進制代表符號)
十六進制顯示輸出使用%x或%X或%#X;
short類型使用前綴h:即%hd表示以十進制顯示short類型的整數,%ho以八進制顯示short類型的整數,%hx表示以十六進制顯示short類型的整數;
1 #include <stdio.h> 2 int main(void) 3 { 4 short i = 4; 5 printf("i = %hd \n", i); 6 printf("i = %#ho \n", i); 7 printf("i = %#hx \n", i); 8 return 0; 9 }
long 類型使用前綴l:即%ld表示以十進制顯示short類型的整數,%lo以八進制顯示short類型的整數,%lx表示以十六進制顯示short類型的整數;
相應的,long long類型使用前綴ll;
注意:
不同的轉換說明是指定計算機以什么樣的格式進行存儲和計算,使用不正確的轉換可能產生錯誤;
1 #include <stdio.h> 2 int main(void) 3 { 4 short sn = 200; 5 long ln = 65537; 6 long long lln = 184467440737095516; 7 printf(" sn = %hd and %d\n", sn, sn); 8 printf(" ln = %ld not is %hd\n", ln, ln); 9 printf("lln = %lld not is %ld \n", lln, lln); 10 return 0; 11 } 12 //print as: 13 sn = 200 and 200 14 ln = 65537 not is 1 15 lln = 1234567891708641112 not is -171798692
結論:
1.int類型被認為是計算機處理整數類型時最高效的類型,當給函數傳遞參數時,編譯器把short類型自動轉換為int類型
2.65537已超出short類型能表示的范圍,使用%hd轉換說明來顯示一個已超出short類型的數據時,計算機則進行顯示該較大整數截斷成short類型的值后進行輸出顯示,由此可推出:超出類型所表示的范圍時,數據將產生截斷;
short類型最大范圍:2^16 - 1 = 65535 即這16位上的數字全是1
可以推出65537用二進制表示時第17位和第1位上的數字為1其余為0;
用short類型顯示輸出long類型數據時,只顯示后16位,故輸出為1;
二、字符型char
2.1 字符型的本質
計算機使用數字編碼來處理字符,即使用特定的整數表示特定的字符,故char本質上為整型;
美國最常用的編碼是ASCII編碼,標准范圍0~127,只需要7位二進制即可表示;但也存在其他字符集超過了127,例如日本漢字kanji字符集,商用統一碼Unicode等等;
C語言把1字節定義為char類型占用的位數;即1Byte=8bit,故無論16位還是32位系統都可以使用char類型
2.2 字符常量和初始化
用單引號括起來的單個字符被稱為字符常量,當編譯器發現’A’便會將其轉換為相應的代碼值(65);注意:單引號僅適用於字符、數字和標點符號;
2.3 非打印字符
非打印字符通常是一些表示行為的字符,如退格、換行、終端響鈴或封鳴,C語言中使用轉義序列來表示一些特殊的字符,同樣的將轉義序列賦值給字符變量時,必須使用單引號將轉義序列括起來;
1 轉義序列 含義 2 \a 警報 3 \b 退格 4 \f 換頁 5 \n 換行 6 \r 回車 7 \t 水平制表位 8 \v 垂直制表位 9 \\ 反斜杠(\) 10 \’ 單引號 11 \” 雙引號 12 \? 問號
2.4 打印字符
1 #include <stdio.h> 2 int main(void) 3 { 4 char ch; 5 printf("Please enter a character…\n"); 6 scanf("%c",&ch) 7 printf("The code for %c is %d\n", ch, ch); 8 return 0; 9 }
輸入某字母后按下回車鍵,scanf()函數會讀取輸入的字符,&符號表示將輸入的字符賦給變量ch,printf()函數將打印兩次ch,一次打印字符類型(轉換說明%c),一次打印整型(%d)
2.5 字符型是有符號還是無符號
取決於編譯器,有的編譯器將char實現為有符號類型,表示范圍是-128~127,有些編譯器則實現為無符號類型,即表示范圍是0~255;但是C語言允許在char前面使用signed,unsigned來顯示指定具體;