我要學會 C 語言(二):有小數點的數不是整數之資料型態與變數
第二篇文章要講的是資料型態。 對於 x^2+2x+1=0 這個方程式你想到什麼?一個方程式裡面最神奇的地方就是它有一個或多個未知數,有了未知數你就可以方便計算很多東西;而且對於一個函數 f(x) = x^2+2x+1,你還可以代入不同的 x 算出不同的值。寫程式也是一樣,你總不希望你的電腦沒有辦法做代數運算,也不能輸入其他的值讓他算出不同東西吧?
第二篇文章要講的是資料型態。
對於 x^2+2x+1=0 這個方程式你想到什麼?一個方程式裡面最神奇的地方就是它有一個或多個未知數,有了未知數你就可以方便計算很多東西;而且對於一個函數 f(x) = x^2+2x+1,你還可以代入不同的 x 算出不同的值。寫程式也是一樣,你總不希望你的電腦沒有辦法做代數運算,也不能輸入其他的值讓他算出不同東西吧?
於是有了變數。有了變數,你就可以暫時儲存一些資料在記憶體裡。
註1:^ 是次方的意思,10^2 代表 10 的平方、5^3 代表 5 的立方。
註2:未知數和變數在英文都稱為 variable。
只不過,在電腦裡面,變數分成好幾種,該種類的變數只能存放該種類的資料,例如一個整數的變數不能放入「9.2」,也不能放入「Noob」。
資料型態
於是有了資料型態,在 C 語言中資料型態大概有這幾種,後面是它的範圍(range):
- char:-128 ~ 127
- short:-32768 ~ 32767
- int:-2147483648 ~ 2147483647
- unsigned:0 ~ 4294967296
- long:-2147483648 ~ 2147483647
- long long:-9223372036854775808 ~ 9223372036854775807
- float:1.17549×10^-38 ~ 3.40282×10^38
- double:2.22507×10^-308 ~ 1.79769×10^308
- long double:3.3621×10^-4932 ~ 1.18973×10^4932
其中粗體的資料型態是比較常用到的。
如果上面那個你覺得你看了霧煞煞,那你只要先記住幾件事情:
- char 叫做字元,可以用來存放符號、英文字母和數字 (詳見ASCII Table)
- int 是 integer 的縮寫,叫做整數。大概也是最常用到的,要放整數先選我就對了!
- long long 叫長長整數,是一種高級整數,當數字大過 2147483647 的時候就要選我~
- float 叫浮點數,要用小數點先選我,我大概可以存小數點以下 7 位數左右
- double 叫倍精度浮點數,是一種高級浮點數,可以存小數點以下 15 位數左右
其他剛開始大概用不太到。
不過這個時候又有問題出現了,你可能會想,既然 long long 那麼強大,可以放個九百京左右,幹嘛還要有 int 和 short int 的存在?那是因為,不同的資料型態是有不同的大小(size)的。當你使用了越大的資料型態,你就會在記憶體(RAM)佔據更多的空間。
資料型態的大小
這個部分沒有那麼重要,不過這裡可以告訴你為什麼不統一用 long long 取代 int,還有為什麼那些資料型態的範圍到底是哪裡來的。
先來回顧一下排列組合吧。電腦是由電路組成,所以只有通電與不通電兩種情況。(這也解釋了為什麼電腦以二進位計算)
- 有 1 條電路的情況下,可以組合出 2 種情況
- 有 2 條電路的情況下,可以組合出 4 種情況
- 有 3 條電路的情況下,可以組合出 8 種情況
- 有 n 條電路的情況下,可以組合出 2^n 種情況
在電腦裡面,我們把這種電路稱為位元(bit),8 個位元稱作一個位元組(byte)。
一般來說:
- short 占了 2 個位元組
- int 占了 4 個位元組
- long long 占了 8 個位元組
- char 占了 1 個位元組
所以 int 占了 4 個位元組 = 32 個 bit,也就有 2^32 = 4294967296 種情況,所以可以存放 4294967296 個數字,其中一半要放負整數(-2147483648~-1)、另外一半要放零和正整數(0~2147483647),這就是為什麼一個占了 n 個位元的變數,範圍是 $-2^{n-1}$ ~ $2^{n-1}-1$ 囉!
宣告變數
終於把資料型態大概說完了,接下來就是變數。剛剛說變數可以讓你儲存一些資料在記憶體裡,可是記憶體就是那麼大,程式怎麼知道要把變數放在記憶體的哪裡?所以我們使用每個變數之前都必須先宣告,一來是幫這個變數命名,二來是讓程式去告訴系統:請給我一個空間來存放資料。
再來,變數命名。雖然變數你要怎麼命名,只要你記得就可以,但是麻煩盡量幫變數想一個有關的名字,例如要存放香蕉數量的變數可以取名叫 banana_count、存放年齡的變數可以叫 age,不然別人看了你的程式碼會不知道你在寫什麼,這個別人包括一個月後的自己。
那,讓我們來宣告一個變數,用來存放你的分數吧。
int score;
什麼?就這樣?
沒錯,宣告一個變數只需要這樣子就可以了。宣告完變數後才可以使用變數,例如給它一個值。
score = 80;
再強調一次,變數一定要先宣告才能使用。如果剛剛沒有宣告的話,這一行就會出現錯誤。
另外,數學上的 = 和 C 語言裡面的 =,意思不太一樣。數學上的 = 是指等號左右兩邊的值相等;但在 C 語言(及絕大部分程式語言裡面),= 的意思是把等號右邊的值存放(assign)到等號左邊的變數裡,有←的味道存在。例如下面這段程式碼就是錯的:
int score;
80 = score;
而要在宣告變數的時候就給定一個值也是可以的,例如:
int score = 80;
再來宣告個油價看看,油價通常有小數點,所以應該使用浮點數:
float gas_price = 27.3;
然而宣告完也給定初值的變數也可以再給別的值,這是沒有問題的。
float gas_price = 27.3;
gas_price = 28.4;
如果給值的時候給了一個超過範圍的,例如一個 int 給了 2147483648,就會發生溢位(overflow),溢位會怎樣?你可能會得到一個非預期的值,或是程式炸掉、電腦炸掉、甚至導致程式被攻擊都是有可能的。
好啦資料型態與變數就先到這邊,不過變數可不只有這樣給值而已,它還有很多事情可以做的!下一篇來講變數的運算~