本節書摘來自華章社群《c語言程式設計:問題與求解方法》一書中的第3章,第3.6節變量類型的進一步讨論,作者:何 勤,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視
3.6 變量類型的進一步讨論
第2章已經介紹了int 、float和char 變量類型。但是在實際程式設計工作中,int型的取值範圍和float型的精度很可能滿足不了應用的需要,下面再介紹三種新的基本變量類型。
(1)double類型
如果float 類型變量的精度達不到在應用中的要求(精度超過6位、取值範圍不夠大或者不足夠接近0),那麼可以使用double型變量。
雖然c語言标準沒有規定double型變量的取值範圍和精度,但是ieee 754标準規定:double型變量的上下限取值範圍是–1.79×10308~1.79×10308之間,double型變量可以表示的最接近0值的正負數是±2.22×10–308,精度在通常的pc上(不論你使用的是windows還是linux作業系統)可達十進制的15個數字(ieee 754标準規定的double型的精度是10位)。大多數計算機制造商都遵守這個規範标準。
double型變量在輸入時,使用格式符%lf(或%lf);而在輸出double型變量時,使用格式符%f(而不是%lf)。
注意:double 型變量在調用scanf()庫函數時,要用%lf (或%lf)與之比對。不要用%f。
double型變量在調用 printf()庫函數時,要用%f與之比對。不要用%lf。
記憶口訣:輸出(即output)時,double 像 float (都有output中的o)。
(2)long int 類型(可簡寫為long)
如果int 型變量在你所用的編譯環境下取值範圍不夠大(比如在–32768~32767之間),而你又不想使用取值範圍更大但有一些缺陷的float型(或double型)變量,則可以使用長整型long int (簡寫為long)。long 型的通常取值範圍是在–2147483648~2147483647之間(大約在正負21億之間)。
long 型變量在調用格式化輸入輸出庫函數時,要用%ld (或%ld) 與之比對。
但是在通常的32位系統中,int型與long型的取值範圍通常是一樣大的,都在–2147483648~2147483647之間,在這種系統中使用long與int型變量沒有什麼差別。
延伸與拓展:如果long int的取值範圍在應用中還是不夠大,通常有兩種選擇:
1)用支援新的c99标準的c編譯器。其中的long long int 類型是64位長整數類型。取值範圍在–263~263–1之間,格式符要用%lld。
2)用後面将要學到的字元數組。
(3)short int 類型
short int 類型就是短整型,可以簡寫為 short 。c89标準隻規定了 int型變量的取值範圍必須大于或等于short型變量的取值範圍。隻有在short型變量配置設定的位元組數少于int型變量的情況下(比如在通常的32位系統中,short型變量占2個位元組記憶體,而int型變量占4個位元組記憶體),在程式中使用short類型變量,才能起到節省記憶體空間的作用。
short類型變量在使用中更容易發生溢出(超出short的通常取值範圍,即從–32768~32767),是以程式設計時要小心,不要因為節省一點點記憶體空間而使資料産生溢出。
在調用格式化輸入輸出庫函數輸入輸出short型的值時,需使用的格式符是%hd。
(4)c89标準規定的全部整型變量類型
上述整型類型short、int、long 所定義的變量,取值都是可正可負的,是以都是有符号(signed)整型。各種整型類型又有對應的無符号(unsigned)整型:
與short對應的無符号短整型:unsigned short
與int對應的無符号整型:unsigned int
與long對應的無符号長整型:unsigned long
所有無符号整型變量的(正數的)取值範圍,都比所對應的有符号整型變量的正數取值範圍大一倍。這是由于有符号整型要用一半數來表示負整數的緣故,細節參見本章提高部分。
(5)c語言中所有變量類型的分類
c語言中的變量類型如圖3-6所示。

(7)溢出問題
如果存入變量中的值超出了變量的取值範圍,稱為發生了溢出。出現整數溢出時,程式通常會繼續運作,但所得結果是錯誤的。如果出現浮點數溢出(包括将一個浮點運算結果指派給一個整型量産生的溢出)的話,将産生未定義的行為。是以,程式設計者必須確定所有表達式的值在運作時都在合理的取值範圍内。
延伸與拓展:溢出導緻的後果
把超出變量允許範圍的值指派給變量,如果值是整型并且變量是無符号型,那麼會直接丢掉超出部分的高位數;如果變量是有符号型,那麼結果值将由編譯器決定的(c語言标準将此交給具體的編譯器自行決定);而把一個太大的浮點型數賦給一個整型變量或浮點型變量的話,這兩種變量都會因為取值範圍太小而無法承受,進而産生未定義的行為,此時任何事情都有可能發生,包括程式終止。