當前位置:學者齋 >

計算機 >C語言 >

C語言中的正負數以及數值溢位

C語言中的正負數以及數值溢位

在數學中,數字有正負之分。在C語言中也是一樣。下面是小編分享的C語言中的正負數以及數值溢位,歡迎大家參考!

C語言中的正負數以及數值溢位

在C語言中,short、int、long 都可以帶上符號,例如:

short a = -10; //負數int b = +10; //正數long c = (-9) + (+12); //負數和正數相加

如果不帶正負號,預設就是正數。

符號也要在記憶體中體現出來。符號只有正負兩種情況,用1位就足以表示,這1位就是最高位。以 int 為例,它佔用32位的記憶體,0~30位表示數值,31 位表示正負號。如下圖所示:

在程式語言中,計數往往是從0開始,例如字串 "abc123",我們稱第 0 個字元是 a,第 1 個字元是 b,第 5 個字元是 3。這和我們平時從 1 開始計數的習慣不一樣,大家要慢慢適應,培養程式設計思維。

在符號位中,用0表示正數,用1表示負數。例如 int 型別的 -10、+16 在記憶體中的表示如下:

如果不希望設定符號位,可以在資料型別前面加 unsigned,如下所示:

unsigned short a = 12;unsigned int b = 1002;unsigned long c = 9892320;

這樣,short、int、long 中就沒有符號位了,所有的位都用來表示數值。也就意味著,使用了 unsigned 只能表示正數,不能表示負數了。

如果是unsigned int,那麼可以省略 int ,只寫 unsigned,例如:

unsigned n = 100;

它等價於:

unsigned int n = 100;

輸出無符號數使用%u,程式碼如下:

#include #include int main(){ int a1 = 1234, a2 = -1234; unsigned int b1 = 5678, b2 = -5678; printf("a1=%d, a1(u)=%u", a1, a1); printf("a2=%d, a2(u)=%u", a2, a2); printf("b1=%d, b1(u)=%u", b1, b1); printf("b2=%d, b2(u)=%u", b2, b2); return 0;}

輸出結果:

a1=1234, a1(u)=1234

a2=-1234, a2(u)=4294966062

b1=5678, b1(u)=5678

b2=-5678, b2(u)=4294961618

可以發現,無論變數宣告為有符號數還是無符號數,只有當以 %u 格式輸出時,才會作為無符號數處理;如果宣告為 unsigned 卻以 d% 輸出,那麼也是有符號數。

a2、b2 的輸出值之所以很奇怪,與它們在記憶體中的儲存形式有關,我們將在《C語言整數在記憶體中是如何儲存的》一節詳細介紹。

最後需要說明的是:不管是否有符號,%o、%x、%X、%#o、%#x、%#X 都是以無符號形式輸出,讀者可以親自測試。

取值範圍和資料溢位

short、int、long 佔用的位元組數不同,所能表示的數值範圍也不同。以32位平臺為例,下面是它們的'取值範圍:

資料型別所佔位元組數取值範圍
short2-32768~32767,即 -215~(215-1)
unsigned short20~65535,即 0~(216-1)
int4-2147483648~2147483647,即 -231~(231-1)
unsigned int40~4294967295,即0~(232-1)
long4-2147483648~2147483647,即 -231~(231-1)
unsigned long40~4294967295,即0~(232-1)

當數值過大或過小時,有限的幾個位元組就不能表示,就會發生溢位。發生溢位時,最高位會被截去。請看下面的例子:

#include int main(){ unsigned int a = 0x100000000; int b = 0xffffffff; printf("a=%u, b=%d", a, b); return 0;}

執行結果:

a=0, b=-1

變數 a 為 int 型別,佔用4個位元組(32位),能表示的最大值為 0xFFFFFFFF,而 0x100000000 = 0xFFFFFFFF + 1,佔用33位,已超出 a 所能表示的最大值,會發生溢位,最高位被截去,剩下的32位都是0。也就是說,在 a 被輸出前,其值已經變成了 0。

  • 文章版權屬於文章作者所有,轉載請註明 https://xuezhezhai.com/zh-tw/jsj/cyuyan/mw94jg.html