C語言 - 第四章 | Basic I/O - 長短整數及無號型態
長短整數型態?
有時候,我們總是會有特殊的需求,例如:大一點的範圍、不要負號等等,因此,C語言也提供了一些彈性的變化。
C語言中有三種整數類型,分別為short、int和long。int稱為整型,short稱為短整型,long稱為長整型。
short
我們有提到int佔用了4 bytes,不過假如要儲存的數字沒有那麼大,用int儲存,就是浪費了。short,中文稱為「短的」,是一個將型態佔用空間砍半的修飾詞,只能用在int上。
1 | short a = 1; |
而輸出時,我們要使用一些方式來讓printf()認得這是整數(short)
1 | printf("%hd", num); |
註:如果不在
short後面指定型態,預設使用int。

long
long,中文稱為「長的」,是一個將型態佔用空間變成翻倍的修飾詞,可以用在int、double、char上。
1 | long a = 2147483647; |
那它是否和short一樣,可以在後面加上int呢?
答案是「可以」,只是有些小地方需要你特別注意!在64位元的系統上,一個long會各自表述,最大的差別在Windows及所有Unix及類Unix系統上,前者一樣是4 bytes,後者則是8 bytes!
因此,在 Windows 上,如果你輸入的是這串
1 | long a = 9876543210; |
那麼你可能會收到編譯器的警告,因為它超過4 bytes所能儲存的範圍,也就是發生了溢位!
你必須改成這樣寫才行
1 | long long int b = 9876543210; |
註:而在
Unix及所有類Unix的系統上,不用擔心這個問題,用哪個都一樣。
而輸出時,我們要使用一些方式來讓printf()認得這是整數(long)
1 | printf("%ld", num); |
如果使用long long int則要使用
1 | printf("%lld", num); |
另外浮點數也可以加上long來修飾,變成更長的浮點數!
1 | long double e = 3.1415926; |
註:總共佔用
16 bytes!long double在C99才能正常使用。

unsigned
當我們不需要正負號,我們可以另外處理正負號的時候,我們可以使用unsigned來取消正負號。
unsigned,中文稱為「無號的」,是一個將有號型態變成無號型態的修飾詞,通常會用來使該型態能儲存的值變成兩倍,只能用在int及char。
1 | unsigned int a = 4294967295; |
如果你在unsigned中使用了負數,那麼你的數字會發生溢位,變回正數,舉例來說
1 | unsigned int a = -1; |
當你需要輸出的話,則是要更換控制字元
1 | printf("%u", num); |
註:如果不在
unsigned後面指定型態,預設使用int。
unsigned還可以跟short及long混搭 (僅限int),例如
1 | unsigned short a = 1; |

控制字元
我們剛剛都在談型態「宣告時」的彈性,現在我們要來聊聊「輸出時」的彈性。printf()還可以做到例如:「限制輸出字數」、「限制小數點後幾位」、「強制顯示正負號」、「對齊」等等。
| 修飾子 | 效果 | 範例 |
|---|---|---|
| - | 靠左對齊 | %-d |
| + | 顯示正負號 | %+d |
| (空白) | 當正數顯示空白,負數顯示負號 | % d |
| (數字) | 最小固定顯示幾個字 | %6d |
| 0 | 在最小固定欄位的字元前加上0,不能和 - 一起使用。 | %06d |
| .(數字) | 小數點之後要顯示幾個字 | %.3f |
註:如需要輸出百分比符號,
printf("%%");
補充
資料型態在記憶體中佔有的大小依編譯器而有所差異,想知道這些資料型態在使用的平台上,佔有的記憶體空間有多少,可以使用 sizeof()運算子,它可以告訴你確實的記憶體大小。
1 |
|

| 型別 | 符號位元 | bytes | 表示方法 | 數值範圍 |
|---|---|---|---|---|
| 整數 | 有 | 2或4 | int | -2147483648 ~ 2147483647 |
| 整數 | 有 | 1 | char | -128 ~ 127 |
| 整數 | 有 | 2 | short | -32768 ~ 32767 |
| 整數 | 有 | 4 | long | -2147483648 ~ 2147483647 |
| 整數 | 有 | 8 | long long | |
| 整數 | 無 | 2或4 | unsigned int | 0 ~ 4294967295 |
| 整數 | 無 | 1 | unsigned char | 0 ~ 256 |
| 整數 | 無 | 2 | unsigned short | 0 ~ 65535 |
| 整數 | 無 | 4 | unsigned long | 0 ~ 4294967295 |
| 整數 | 無 | 8 | unsigned long long | |
| 浮點數 | 有 | 4 | float | 10^-38~10^38 |
| 浮點數 | 有 | 8 | double | 10^-308~10^308 |
| 字元 | 有 | 8 | char | -128 ~ 127 |
註:bytes = 8bit
註:以上參考了
hackersir gitbooks
語言技術:C 語言
百度 - short (c语言)
資料型別(Data Type)
