學習了二進制數據,我們知道,在計算機系統中,存儲的任何數據都是以二進制數據的格式存儲。存儲數據的最小單位是字節(Byte),一個字節的容量是八位(bit),可以存儲8個二進制數據。在講解“有符号數”和“無符号數”之前,我們先來舉一個例子。
例如,有個人(稱呼A)去爬山,半路上碰到一個朋友,朋友送了他一瓶水,此時A手上擁有一瓶水;那麼,有如下的情況:
(1) 如果A覺得渴,那麼,A覺得手上的這瓶水很寶貴,就把這瓶水喝掉;
(2) 如果A覺得不渴,那麼,A覺得手上的這瓶水很重,麻煩,就丢掉;
(3) A手上的那瓶水,永遠是那瓶水,本身沒有任何變化。但是,A以不同的角度來看這瓶水,那麼,會得到不同的結果。
在這個例子中,可以進行比較,如下:
(1) 人員A就如同一個計算機系統;
(2) 人員A手上拿有一瓶水,就如同計算機内存中,一個字節存儲的一個數值;
(3) 例如,在内存的一個字節中存儲255這個整數值。那麼,一個字節中的255這個數值,永遠是255,不會有任何改變。但是,計算機系統把255這個數值,以不同的角度來看待,會有不同的結果。
那麼,在計算機系統中,可以把内存中存儲的數值當做“有符号數”和“無符号數”來看待。同一個數值,以不同的角度來看待,有不同的結果。
下面,我們來看看計算機系統對“有符号數”和“無符号數”的處理。
有符号數的定義是:字節的最高位作為符号位,其餘的是數值位。例如一個字節中存儲的二進制數為1100 1000,最高位1作為符号位,其餘的7位 100 1000 作為數值位。
那麼,符号位占據1位,就有0和1這樣的兩種數值,就有:
(1) 如果符号位為0,那麼字節中存儲的數值是正數;
(2) 如果符号位為1,那麼字節中存儲的數值是負數;
對于1100 1000這樣的二進制數據,符号位是1,就表示負數。在有符号數中,表示負數的算法是:
(1) 把數值位中存儲的二進制數據,每個位都取反,就是原來為0的值變為1,原來為1的值變為0;
(2) 給對取反後的二進制數據加1,得到的數值就得到負數值;
所以,有符号數可以表示正數,也可以表示負數。
無符号數的定義是:沒有符号位,所有的位數都是數值位。所以表示的都是正數。
例如1100 1000這個數值,如果作為有符号數看待,那麼符号位是1,數值位是100 1000。所以,符号位是1,所以,這個數據是負數。然後,表示成十進制時,對數值位的操作是:
(1) 數值位取反,得到011 0111;
(2) 對取反後的數值 011 0111加1得到011 1000,數值位的值為56;
那麼,1100 1000這個二進制數據表示為“有符号數”時,就是-56這個數值。
如果作為無符号數看待,那麼,就沒有符号位,所有的位數都是數值位,所以11001000都作為數值位,表示的十進制數值是180。
例如,0111 0011這個數值,如果當做“有符号數”看待,那麼,其符号位是0,所以,表示正數,數值位是115,所以,表示正115這個數值。如果當做無符号數看待,所有位都是數值位,計算得到115這個數值,所以,表示正115。所以我們可以總結:
(1) 無符号數,總是表示正數。所有位數都表示數值位。
(2) 有符号數,可以表示正數和負數,最高位是符号位,其餘位都是數值位。如果符号位是0,則表示正數;如果符号位是1,則表示負數。對于負數的表示方法是:數值位全部取反,再加1,得到的數值就是負數值。
,