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)