- C語言入門很輕松(微課超值版)
- 云尚科技編著
- 2798字
- 2022-07-29 14:43:36
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的程序運行結果
- Python 3.7網絡爬蟲快速入門
- Learning PostgreSQL
- OpenCV實例精解
- JavaScript:Functional Programming for JavaScript Developers
- Java入門很輕松(微課超值版)
- PHP 編程從入門到實踐
- Building Minecraft Server Modifications
- 深入RabbitMQ
- Python深度學習:基于TensorFlow
- Getting Started with LLVM Core Libraries
- Java實戰(第2版)
- AIRIOT物聯網平臺開發框架應用與實戰
- 0 bug:C/C++商用工程之道
- Go語言編程
- Python函數式編程(第2版)