- C語言程序設計教程
- 戴彥群 徐草草 溫愛紅主編
- 3989字
- 2020-08-21 13:19:51
1.3 基本數據類型
1.3.1 整型數據
C語言中用整型數據來表示整數。
(1)整型常量
C語言的整型常量可以有以下三種表示形式。
十進制整型常量:例如123、?45、0、158L、358000L等(1L表示長整型,稍后介紹)。
八進制整型常量:以0開頭表示,例如012L、077L、0200000L等。
十六進制整型常量:以0x開頭表示,例如0x15L、0xA5(A表示十進制值10,B表示十進制值11,依此類推)、0x10000L等。
長整型數158L和基本整型常量158在數值上并無區別。在TC編譯軟件中的區別是為長整型常量分配4字節的存儲空間,只為基本整型常量分配2字節的存儲空間,在VC++6.0編譯軟件中都分配4字節的存儲空間。
無符號數也可用后綴表示,整型常數的無符號數的后綴為“U”或“u”。例如,358u、0x38Au、235Lu均為無符號數。
前綴、后綴可同時使用,以表示各種類型的數。例如,0xA5Lu表示十六進制無符號長整數A5,其十進制為165。
(2)整型變量
①整型變量的基本類型 在C語言中,按照整型變量所占的二進制位數來分類,可分為:
基本型:類型說明符為int,VC中占4字節的內存單元。
短整型:類型說明符為short int或short。所占字節和取值范圍均與基本型相同。
長整型:類型說明符為long int或long,在內存中占4字節。
根據整型變量是否帶符號位來分類,可以分為帶符號類型和無符號類型。帶符號類型用關鍵字signed表示,無符號類型用關鍵字unsigned表示,如果既不指定為signed,也不指定為unsigned,則隱含為帶符號型(signed),因此signed是完全可以省略不寫的。而無符號型必須用unsigned指定,用unsigned與上述三種類型匹配可構成:
無符號基本型:類型說明符為unsigned int或unsigned。
無符號短整型:類型說明符為unsigned short。
無符號長整型:類型說明符為unsigned long。
②整型變量的定義與賦值 定義整型變量的語法是:
限定詞int變量名表
限定詞包括long、short和unsigned、signed,限定詞缺省,隱含為signed。在有限定詞的情況下,int可以省略。
(3)整型變量的長度和取值范圍
在不同的C編譯系統中對各類整型變量所占的字節數規定不同,以16位計算機系統上帶符號整型數據占16位為例,其存儲示意圖如圖1-2所示。

圖1-2 基本整型存儲示意圖
如果符號位為0,表示是正整數,第1~15位全為1時能表示的最大整數是215-1,即32767。如果符號位為1,表示是負整數,第1~15位全為0時表示的最小整數是-215,即-32768。
可以用同樣的方法計算其他整型數的取值范圍,表1-1中列出了在Visual C++6.0系統中整數類型的字節長度和取值范圍。
表1-1 整數類型的字節長度和取值范圍

注:表中帶方括號的部分在整型變量定義時可以省略不寫,不影響變量的取值范圍。
1.3.2 實型數據
C語言中實型數據又稱為浮點數,有實型常量和實型變量,主要用于表達和處理實數。
(1)實型常量
在數學中,表示小數有兩種方法:一種是小數表示法,另一種是科學計數法。例如126.8和1.268×102。在C語言中也是用這兩種形式來表示浮點數,只不過102用1E+2表示。
①十進制小數形式:由數字和小數點組成。書寫時,小數點不可以省略。例如1.23、.123、123.、123.0、0.123、0.0等都是合法的實型常量。
②指數形式:由十進制數加上階碼標志e(或E)及階碼(只能為整數,可以帶符號)組成。其一般形式為aEn。a為十進制數,n為十進制整數,都不可缺少。例如1.235可以表示為1.235×100、0.1235×101、12.35×10-1等形式,在C語言中可表示為1.235e0、0.1235e1、123.5e-1等形式。如果寫成e10、.123e2.5、.e10、e.、e+3都是不合法的指數形式,在字母“e”或“E”的前后以及數字之間不得插入空格。
另外,實型常量的后綴用F(或f)表示單精度型,而后綴用L(或l)表示長精度型。
(2)實型變量
實型數據一般占4字節(32位)的內存空間,并按指數形式存儲。實數+2.17189的指數形式是:+0.217189×101=+0.217189E+1,在內存中的存放形式如圖1-3所示。

圖1-3 實數2.17189在內存中的存放形式
由此可見,小數部分占的位(bit)數越多,數的有效數字越多,精度越高。指數部分占的位數越多,則能表示的數值范圍越大。
實型變量有單精度型、雙精度型和長雙精度型之分,分別用類型名float、double和long double進行定義。C語言中規定了實型變量的字節長度和取值范圍,如表1-2所示。
表1-2 實型變量的字節長度和取值范圍

由于實型變量是用有限的存儲單元進行存儲的,因此提供的有效數字是有限的,有效位以外的數字將變得沒有意義,由此可能產生一些誤差。
1.3.3 字符型數據
C語言可以處理字符型數據。字符型數據包括字符型常量和字符串常量。
(1)字符型常量
C的字符型常量是用一個單引號括起來的一個字符。例如'a'、'B'、'$'、'!'、'5'等都是字符常量(注意:'a'和'A'是不同的字符常量)。
字符值是以ASCII碼的形式存放在變量的內存單元之中的。一個字符型變量在內存中占1個字節,只能存放一個字符。因此,在單引號中只能有一個字符,而'ab'是錯誤的。
例如,對字符變量c1、c2賦予'a'和'b'值:
c1='a'; c2='b';
字符'a'的十進制ASCII碼是97,字符b的十進制ASCII碼是98。實際上是在c1、c2兩個單元內存放的是97和98的二進制代碼,如圖1-4所示。

圖1-4 字符型常量的存儲
從這個意義上來說,也可以把字符型數據看成是整型量。C語言允許對整型變量賦以字符值,字符型數據可以像整型數據一樣參與四則運算。例如:
'b'-'a'=1
等價于:98-97=1
(2)轉義字符
在C語言中除了上述形式上比較直觀的字符常量外,還可將退格、換行等非圖形字符表示成字符型常量。其方法是使用轉義符“\”與一些特殊字符構成轉義字符。轉義字符主要用來表示那些不便于用一般字符表示的控制字符。常用的轉義字符及其含義如表1-3所示。
表1-3 以“\”開頭的轉義字符及其功能

說明:轉義字符的含義是將反斜杠“\”后面的字符轉變成為別的意義。例如“\r”中的“r”不代表字符“r”,而作為回車字符。這種擴展方式看上去好像是兩個甚至多個字符,實際上代表一個字符。再如“\123”并非三個字符,而是八進制數(123)8(其對應的十進制數為83)所對應的ASCII字符'S';同理,'\xaf '也并非三個字符,而是十六進制數(af)16所對應的ASCII字符。讀者可以自己推算其對應的字符并可用C程序驗證一下。
【例1-3】轉義字符的使用。
/ *源程序1-3.C* / #include <stdio.h> void main() { printf("cr i\tna\07\n"); / *'\07'代表響鈴(BEL)* / printf("ab \t\b\bc d"); }
程序運行結果如下(注:└┘代表空格):
cr└┘i└┘└┘└┘└┘na ab└┘└┘└┘└┘c d
(3)字符型變量
字符型變量是用來存放字符常量的,字符型變量在內存中占1個字節存儲空間,并且只能存放1個字符常量。
字符型變量的定義格式和書寫規則都與整型變量相同。格式為:
char變量名表;
例如:
char c1,c2,c3; c1='a'; / * 是正確的 * / c2='ab'; / * 是錯誤的,只能存放到1個字符的變量不能存放多個字符 * / c3="a"; / * 是錯誤的,只能存放到1個字符的變量不能存放字符串 * /
也允許對字符型變量賦以整型值。在輸出時,允許把字符型變量按整型量輸出,也允許把整型量按字符型量輸出。但因為整型量是4字節量,字符量為單字節量,當整型量按字符型量處理時,只有低8位參與處理。
【例1-4】字符型數據的算術運算。
/ *源程序1-4.C* / #include <stdio.h> void main() { char c1,c2,c3; c1='A'+1; / * 將c1賦值為'A'+1* / c2='0'+1; / * 將c2賦值為'0'+1* / c3=122; / * 將c3賦值為整數122* / c1=c1+32; c2=c2+5; printf("%c,%d\n",c1,c1); printf("%c,%d\n",c2,c2); printf("%c,%d\n",c3,c3); }
程序運行結果為:
b,98 6,54 z,122
(4)字符串常量
C語言中規定,字符常量是用單引號括起來的單個字符,而字符串常量則是用一對雙引號括起來的字符序列。例如"I love this game. " "hello, China" "a" "500.53$"等都是字符串常量。
在內存中存儲一個字符串所占的字節數除了等于這個字符串中的有效字符外,還必須加一個字節存儲字符串結束標志'\0'。例如,對于字符串"CHINA",其在內存中實際的存儲形式如圖1-5所示。

圖1-5 內存中的存儲形式
注意:盡管'\0'對于一個字符串是必不可少的,但是在書寫時卻并不需要將之寫在字符串的后面,如不寫成"CHINA\0",'\0'由C語言編譯自動處理。其實在程序中書寫的字符串,只要是用雙引號括起來的,則系統會自動給這個字符串加上'\0'。
字符串常量和字符常量是不同的。它們之間主要有以下區別:
·字符常量由單引號括起來,字符串常量由雙引號括起來。
·字符常量只能是單個字符,字符串常量則可以含0~n個字符。
·可以把一個字符常量賦予一個字符變量,但不能把一個字符串常量賦予一個字符變量。
在C語言中沒有相應的字符串變量,但是可以用一個字符數組來存放一個字符串常量。這在后面章節中介紹。
·字符常量占1字節的內存空間。字符串常量所占的內存字節數等于字符串中字節的數量加1。增加的1字節中存放字符串結束的標志'\0'(ASCII碼為0)。例如:
'a'在內存中占一個字節,可表示為:
"a"在內存中占兩個字節,可表示為:
1.3.4 數據混合運算及數據類型轉換
C語言規定,不同類型的數據可以在同一表達式中進行混合運算,但在運算時要進行類型轉換。例如,20+'c'+3.5-597.123*'a'是合法的表達式。在進行運算時,不同類型的數據要先轉換成同一類型,再進行運算。數據類型的轉換方式有兩種:一種是自動轉換;另一種是強制轉換。
(1)類型的自動轉換
這種轉換由編譯系統自動完成,規則如下:
①若參與運算量的類型不同,則先轉換成同一類型,然后進行運算。
②轉換按數據長度增加的方向進行,以保證精度不降低。例如,int型和long型數據運算時,先把int型轉成long型后再進行運算。
③所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double型,再進行運算。
④char型和short型參與運算時,會先轉換成int型。
⑤在賦值運算中,賦值運算符兩邊量的數據類型不同時,賦值運算符右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度比左邊長,將丟失一部分數據,這樣會降低精度,丟失的部分則會進行四舍五入處理。
混合運算的結果一定是表達式中精度最高的數據類型,如圖1-6所示。如對于表達式20+'c'+3.5-597.123*'a',其結果一定是double型的。

圖1-6 數據的轉換規則
【例1-5】讀程序,理解不同類型數據的混合運算。
/ *源程序1-5.C* / #include <stdio.h> void main() { double a; a=7/2+2.5; printf("%f\n",a); }
程序的運行結果為:
5.500000
(2)強制類型轉換
自動類型轉換提供了一種從低級類型向高級類型轉換的運算規則,以保證不降低運算結果的精度。強制類型轉換機制可以將一個表達式轉換成所需要的類型。強制類型轉換的一般形式為:
(類型名)(表達式)
【例1-6】讀程序,理解類型的強制轉換。
/ *源程序1-6.C* / #include <stdio.h> void main() { float x=3.7,y=4.4,z; z=(int)(x+y); / * 這里對(x+y)的結果進行了強制類型轉換 * / printf(“x=%f,y=%f,z=%f\n”,x,y,z); }
程序運行結果為:
3.700000,4.400000,8.000000
說明:
①類型名應用()括起。
②強制類型轉換只是生成一個中間數據,而原有數據的類型、值均不發生變化。
③注意(int)x+y與(int)(x+y)的區別。
- Java逍遙游記
- JavaScript前端開發模塊化教程
- MySQL數據庫管理實戰
- Learning PostgreSQL
- 造個小程序:與微信一起干件正經事兒
- Microsoft Dynamics 365 Extensions Cookbook
- VMware vSphere 6.7虛擬化架構實戰指南
- Windows Server 2012 Unified Remote Access Planning and Deployment
- Python程序設計案例教程
- OpenCV 4計算機視覺項目實戰(原書第2版)
- Learning Unreal Engine Android Game Development
- Java Web從入門到精通(第2版)
- 監控的藝術:云原生時代的監控框架
- Android Sensor Programming By Example
- ASP.NET開發寶典