當前位置:網站首頁>有符號數(signed) 和 無符號數(unsigned)

有符號數(signed) 和 無符號數(unsigned)

2022-01-28 04:19:49 CD4356


我們在程序中看到的數字都是十進制值(加OX前綴或H後綴等修飾的數值除外),但在計算機底層它們都是以二進制的形式錶示的。即用0和1來錶示,對各種進制之間的轉換不熟悉的可以看看,進制轉換 和 舉例說明


有符號數


  • c語言中,數值分為有符號數(signed) 和 無符號數(unsigned),有符號數區分正數和負數,無符號數只有正數,程序中如果不通過unsigned指定(如unsigned int x 來指定x為無符號數),則x默認為有符號數。

  • 那麼問題來了,有符號數 區分正數和負數,僅用0和1如何錶示呢? [ 以8比特的二進制為例 ]


原來,計算機中規定了,用有符號數二進制的最高比特(二進制最左邊的比特是最高比特,如紅1和紅0)來區分正負數,最高比特是0則為正數,是1則為負數。所以在有符號數中,二進制的最高比特被稱為符號比特
cd4356

例如下面有符號二進制數對應的十進制值:

  • 1 1 1 1   1 1 1 1 :  − 2 7 -2^{7} 27 + 2 6 2^{6} 26 + 2 5 2^{5} 25 + 2 4 2^{4} 24 + 2 3 2^{3} 23 + 2 2 2^{2} 22 + 2 1 2^{1} 21 + 2 0 2^{0} 20 = -1

  • 1 0 0 1   0 1 0 0  :  − 2 7 -2^{7} 27 + 0 0 0 + 0 0 0 + 2 4 2^{4} 24 + 0 0 0 + 2 2 2^{2} 22 + 0 0 0 + 0 0 0 = -108

  • 0 1 0 1   1 0 0 1  :  0 0 0 + 2 6 2^{6} 26 + 0 0 0 + 2 4 2^{4} 24 + 2 3 2^{3} 23 + 0 0 0 + 0 0 0 + 2 0 2^{0} 20 = 89

cd4356

從中可看出:

  • 一個負數,其二進制數的最高比特一定是1

  • 有符號數最高比特,不僅有符號比特的意思,還有權重的意思。

  • 除了最高比特是1,其餘比特均為0時,有符號數取得最小值 min = − 2 7 -2^{7} 27 + 0 0 0 + 0 0 0 + 0 0 0 + 0 0 0 + 0 0 0 + 0 0 0 + 0 0 0 = − 2 7 -2^{7} 27, 即: − 2 w − 1 -2^{w-1} 2w1

  • 最高比特是0,其餘比特均為1時,有符號數取得最大值 max = 2 6 2^{6} 26 + 2 5 2^{5} 25 + 2 4 2^{4} 24 + 2 3 2^{3} 23 + 2 2 2^{2} 22 + 2 1 2^{1} 21 + 2 0 2^{0} 20 = 2 7 − 1 2^{7}-1 271, 即: 2 w − 1 − 1 2^{w-1}-1 2w11

故,有符號數的取值範圍是:[ − 2 w − 1 -2^{w-1} 2w1 , 2 w − 1 − 1 2^{w-1}-1 2w11] ,w是二進制比特數,比如上面的二進制數是8比特,數據類型int是32比特(4字節)



無符號數


  • 無符號類型 需通過unsigned關鍵字指定(如:unsigned int x;),否則默認為有符號數。[Java中沒有無符號類型]

cd4356

無符號數,最高比特錶示權重,沒有符號比特之意。所以無符號數都是大於等於0的數。無符號數的取值範圍是:[ 0, 2 w − 1 2^{w}-1 2w1]


例如下面有符號二進制數對應的十進制值:

  • 1 1 1 1   1 1 1 1 :  2 7 2^{7} 27 + 2 6 2^{6} 26 + 2 5 2^{5} 25 + 2 4 2^{4} 24 + 2 3 2^{3} 23 + 2 2 2^{2} 22 + 2 1 2^{1} 21 + 2 0 2^{0} 20 = 2 8 − 1 2^{8}-1 281

版權聲明
本文為[CD4356]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201280419486030.html

隨機推薦