官术网_书友最值得收藏!

2.4 C語言的數據類型

數據類型是數據的基本屬性,描述的是數據的存儲格式和運算規則。不同類型的數據內存中所需存儲空間的大小是不同的,能夠支持的運算、相應的運算規則也是不同的,因而在學習C語言程序時必須準確地掌握和運用數據的數據類型。C語言中的數據類型如表2-9所示。

☆大牛提醒☆

數組類型和結構類型統稱為聚合類型,函數的類型指的是函數返回值的類型。當函數沒有必要返回一個值時,就需要使用空類型設置返回值的類型。

空類型用于指定沒有可用的值,它通常用于表2-10所示的三種情況。

表2-9 C語言中的數據類型

表2-10 空類型可用的情況

2.4.1 整型數據類型

整型數據類型為Integer,例如,0、-12、255、1、32767等都是整型數據,根據數據在程序中是否可以改變數值,可分為整型常量和整型變量;根據有無符號可以分為有符號型和無符號型。有符號型的整數既可以是正數,也可以是負數;無符號型的整數只包含0和正數。

整型數據類型(int)可以用4種修改符的搭配來描述,有符號型(signed)、無符號型(unsigned)、短整型(short)和長整型(long)。如表2-11所示列出了關于標準整數類型的存儲大小和值范圍。

表2-11 標準整數類型的存儲大小和值范圍

為了得到某個類型或某個變量的存儲大小,用戶可以使用sizeof(type)表達式查看對象或類型的存儲字節大小。

【例2.4】編寫程序,獲取整型數據類型的存儲大小(源代碼\ch02\2.4.txt)。

圖2-6 例2.4的程序運行結果

程序運行結果如圖2-6所示。

☆大牛提醒☆

在函數printf()中,參數%lu為32位無符號整數。

2.4.2 浮點型數據類型

浮點數的小數點位置是不固定的,可以浮動,C語言中提供了三種不同的浮點格式,分別為:單精度浮點型(float)、雙精度浮點數(double)和長雙精度浮點型(long double)。

當精度要求不嚴格時,比如員工的工資,需要保留兩位小數,就可以使用float類型;double類型提供了更高的精度,對于絕大多數用戶來說已經夠用;long double類型支持極高精度的要求,但很少使用。如表2-12所示為浮點型數據類型的存儲大小、值范圍和精度的細節。

表2-12 浮點型數據類型的存儲大小、值范圍和精度

【例2.5】編寫程序,輸出浮點型數據類型占用的存儲空間以及它的范圍值(源代碼\ch02\2.5.txt)。

圖2-7 例2.5的程序運行結果

程序運行結果如圖2-7所示。

☆大牛提醒☆

%E為以指數形式輸出單、雙精度實數。

2.4.3 字符型數據類型

在C語言中,字符型是整型數據中的一種,它存儲的是單個字符,存儲方式是按照ASCII(American Standard Code for Information Interchange,美國信息交換標準碼)的編碼方式,每個字符占一字節,字符使用單引號“'”引起來,如'A'、'5'、'm'、'$'、';'等。

字符型的輸出,既可以使用字符的形式輸出字符,即采用%c格式控制符,還可以使用整數輸出方式。例如:

     char c ='A';
     printf("%c,%u",c);

這段代碼輸出結果是:A,65。此處的65是字符'A'的ASCII碼值。

【例2.6】編寫程序,實現字符和整數的相互轉換輸出(源代碼\ch02\2.6.txt)。

圖2-8 例2.6的程序運行結果

程序運行結果如圖2-8所示。從輸出結果可以得出,字符型數據是以ACSII碼值形式存儲的,字符a和整數97是可以相互轉換的,整數98是可以與字符b相互轉換的。

2.4.4 自定義數據類型

使用typedef可以自定義數據類型,語句由3個部分組成,分別是關鍵字typedef、原數據類型和新數據類型。具體的應用格式如下:

     typedef   原數據類型   新數據類型

一旦定義,其之后的程序中可以使用新數據類型替換掉舊數據類型。

【例2.7】編寫程序,利用自定義數據類型實現字符的輸出(源代碼\ch02\2.7.txt)。

圖2-9 例2.7的程序運行結果

程序運行結果如圖2-9所示。從輸出結果可以看出以上語句的含義是給char取一個別名myChar,之后使用myChar代替char定義字符變量c1,c1就是字符類型。

2.4.5 數據類型的轉換

在計算過程中,如果遇到不同的數據類型參與運算就會將數據類型進行轉換,C語言編譯器轉換數據類型的方法有2種,一種是自動轉換,一種是強制轉換。

1.自動轉換

C語言中設定了不同數據參與運算時的轉換規則,編譯器就會自動進行數據類型的轉換,進而計算出最終結果,這就是自動轉換。數據類型的自動轉換規則如圖2-10所示。

C語言編譯器在自動轉換數據類型時,應遵循以下規則:

(1)如果參與運算量的類型不同,則先轉換成同一類型,然后進行運算。

(2)自動轉換數據類型按數據長度增加的方向進行,以保證精度不降低。例如整型數據類型和長整型運算時,會先把整型數據類型轉成長整型后再進行運算。

(3)所有的浮點運算都是以雙精度進行的,即使僅含單精度量運算的表達式,也要先轉換成雙精度型,再做運算。

(4)字符型和短整型參與運算時,必須先轉換成整型數據類型。

圖2-10 數據類型的自動轉換規則

(5)在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度比左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四舍五入向前舍入。例如:

     int i;
     i=2 + 'A';

計算的規則是先計算“=”號右邊的表達式,字符型和整型混合運算按照數據類型轉換先后順序,把字符型轉換為int類型65,然后求和得67,最后把67賦值給變量i。

再例如如下語句:

     double d;
     d=2+'A'+1.5F;

計算的規則是先計算“=”號右邊的表達式,表達式中有字符型、整型和浮點型3種類型,因為有浮點型參與運算,所以“=”右邊表達式的結果是浮點型。按照數據類型轉換順序,把字符型轉換為雙精度浮點型65.0,2轉換為2.0,1.5F轉換為1.5,最后把雙精度浮點數68.5賦值給變量d。

上述情況都是由低精度類型向高精度類型轉換,如果逆向轉換,將會出現丟失數據的危險,編譯器會以警告的形式給出提示。例如:

     int i;
     i=1.2;

浮點數1.2舍棄小數位后,把整數部分1賦值給變量i。如果i=1.9,運算后變量i的值依然是1,而不是2。

【例2.8】編寫程序,利用數據類型的自動轉換,從而計算圓的面積(源代碼\ch02\2.8.txt)。

程序運行結果如圖2-11所示。從運算結果可以看出,雖然PI為浮點型;s,r為整型,但在執行s=r*r*PI語句時,r和PI都轉換成雙精度浮點型計算,結果也為雙精度浮點型。但是由于s為整型,故賦值結果仍為整型,舍去了小數部分,最后輸出結果為201。

2.強制轉換

當數據類型需要轉換時,有時編譯器會給出警告,提示程序會存在潛在的隱患,如果非常明確地希望轉換數據類型,就需要用到顯式類型轉換,也就是常說的強制轉換。其一般形式為:

     (類型說明符)   (表達式)

其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。例如:

     (float) a   把a轉換為實型
     (int)(x+y)   把x+y的結果轉換為整型

在數據類型需要強制轉換時應注意以下問題:

(1)類型說明符和表達式都必須加括號(單個變量可以不加括號),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之后再與y相加了。

(2)無論是強制轉換還是自動轉換,都只是為了本次運算的需要而對變量的數據長度進行的臨時性轉換,而不改變數據說明時對該變量定義的類型。

【例2.9】編寫程序,實現數據類型的強制轉換,從而輸出需要的數據類型格式(源代碼\ch02\2.9.txt)。

程序運行結果如圖2-12所示。從輸出結果可以看出,實例中先計算x+y值為8.8,然后賦值給a,因為a為整型,所以自取整數部分8,a=8;接下來b把x+y強制轉換為整型;最后10/i是兩個整數相除,結果仍為整數2,把2賦給浮點數f;x為浮點型直接輸出。

圖2-11 例2.8的程序運行結果

圖2-12 例2.9的程序運行結果

主站蜘蛛池模板: 黔西县| 喀喇沁旗| 焦作市| 宁武县| 垦利县| 信宜市| 凭祥市| 大足县| 柳州市| 邵东县| 汉川市| 鄄城县| 浦东新区| 长武县| 普宁市| 闵行区| 屯门区| 扶绥县| 灵璧县| 乳源| 赫章县| 台安县| 井研县| 马鞍山市| 堆龙德庆县| 青铜峡市| 思茅市| 滁州市| 嵊泗县| 当雄县| 乌拉特前旗| 武鸣县| 竹北市| 武强县| 铁岭市| 汝南县| 大竹县| 恭城| 高清| 崇礼县| 错那县|