Like Share Discussion Bookmark Smile

J.J. Huang   2019-10-08   C   瀏覽次數:

C語言 - 第四章 | Basic I/O - 長短整數及無號型態

長短整數型態?

有時候,我們總是會有特殊的需求,例如:大一點的範圍、不要負號等等,因此,C語言也提供了一些彈性的變化。

C語言中有三種整數類型,分別為shortintlongint稱為整型,short稱為短整型,long稱為長整型。


short

我們有提到int佔用了4 bytes,不過假如要儲存的數字沒有那麼大,用int儲存,就是浪費了。
short,中文稱為「短的」,是一個將型態佔用空間砍半的修飾詞,只能用在int上。

1
2
3
4
5
6
7
short a = 1;
short b = 32767;
short c = -32767;

short int a = 1;
short int b = 32767;
short int c = -32767;

而輸出時,我們要使用一些方式來讓printf()認得這是整數(short)

1
printf("%hd", num);

註:如果不在short後面指定型態,預設使用int


long

long,中文稱為「長的」,是一個將型態佔用空間變成翻倍的修飾詞,可以用在intdoublechar上。

1
long a = 2147483647;

那它是否和short一樣,可以在後面加上int呢?
答案是「可以」,只是有些小地方需要你特別注意!在64位元的系統上,一個long會各自表述,最大的差別在Windows及所有Unix及類Unix系統上,前者一樣是4 bytes,後者則是8 bytes

因此,在 Windows 上,如果你輸入的是這串

1
2
long a = 9876543210;
long int b = 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
2
long double e = 3.1415926;
printf("%Lf", e);

註:總共佔用16 byteslong doubleC99才能正常使用。


unsigned

當我們不需要正負號,我們可以另外處理正負號的時候,我們可以使用unsigned來取消正負號。

unsigned,中文稱為「無號的」,是一個將有號型態變成無號型態的修飾詞,通常會用來使該型態能儲存的值變成兩倍,只能用在intchar

1
2
unsigned int a = 4294967295;
unsigned char b = 255;

如果你在unsigned中使用了負數,那麼你的數字會發生溢位,變回正數,舉例來說

1
2
unsigned int a = -1;
unsigned int b = 255;

當你需要輸出的話,則是要更換控制字元

1
printf("%u", num);

註:如果不在unsigned後面指定型態,預設使用int

unsigned還可以跟shortlong混搭 (僅限int),例如

1
2
3
4
5
unsigned short a = 1;
unsigned short int a = 1;
unsigned long a = 1;
unsigned long int a = 1;
unsigned long long int a = 1;


控制字元

我們剛剛都在談型態「宣告時」的彈性,現在我們要來聊聊「輸出時」的彈性。
printf()還可以做到例如:「限制輸出字數」、「限制小數點後幾位」、「強制顯示正負號」、「對齊」等等。

修飾子 效果 範例
- 靠左對齊 %-d
+ 顯示正負號 %+d
(空白) 當正數顯示空白,負數顯示負號 % d
(數字) 最小固定顯示幾個字 %6d
0 在最小固定欄位的字元前加上0,不能和 - 一起使用。 %06d
.(數字) 小數點之後要顯示幾個字 %.3f

註:如需要輸出百分比符號,printf("%%");


補充

資料型態在記憶體中佔有的大小依編譯器而有所差異,想知道這些資料型態在使用的平台上,佔有的記憶體空間有多少,可以使用 sizeof()運算子,它可以告訴你確實的記憶體大小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("型態\t\t大小(bytes)\n");
printf("short\t\t%lu\n", sizeof(short));
printf("int\t\t%lu\n", sizeof(int));
printf("long\t\t%lu\n", sizeof(long));
printf("float\t\t%lu\n", sizeof(float));
printf("double\t\t%lu\n", sizeof(double));
printf("long double\t%lu\n", sizeof(long double));
printf("char\t\t%lu\n", sizeof(char));

return 0;
}

型別 符號位元 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)