iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
0
自我挑戰組

計算機概論X30天系列 第 12

Day12:[計算機概論]負數怎麼在電腦中儲存?

  • 分享至 

  • twitterImage
  •  

閱讀前,建議可以參考Day1:閱讀指南&為何選擇這個題目?

▌挑戰簡介

  • 題目:計算機概論X30天

  • 挑戰內容:連續30天紀錄計算機概論、離散數學、演算法、資料結構等課程,還有自己學習程式的心得體悟。

  • 本篇性質:純粹上課內容的紀錄,不會有太嚴謹或是流暢的說明

    • 免強適合閱讀的人:對2進位、bit有概念的人
    • 注意:我沒有真的寫的很清楚,所以看不懂真的不是你笨!!(請不要因此懷疑自己智商)

▌負數怎麼用bit儲存

前面的作法處理的都是正數

比如說假設我們有4bit,那因為每個bit是1or0,所以4bit就可以表示16個數字(從0~15)

像說4可以表示為0100

但是....如果我想要表達負數怎麼辦?比如說-4怎麼表達

方法1 Signed integers

於是就有人想到:把第一個bit來表示正/負,後面的bit表示其絕對值

比如說+就用0表示:像是+4,可以表示成0100。其中0表示+,100表示4
比如說-就用1表示:像是-4,可以表示成1100。其中1表示-1,100表示4

而原本4bit本來可以表達0~15,現在則變成可以表達-7~7

這種表示法稱為'Signed integers'

但是這種表示法有兩個缺點

  1. 0會有兩種表示法:

以4bit來說,0可以表示為0000跟1000,但這樣就浪費資源,同樣是0,幹嘛用兩種編碼方式?

2.加法不能用

以4bit來說,5是0101,-5是1101,相加正常來說要是0

如果我們真的做加法,會發現0100+1100是10010,省略第一個1,也就是0010(因為限制4bit所以第一個要省略)

當bit不足以表達超過範圍的數據時,這稱為overflow

可是0010也不是0,轉成10進位是2。

方法2:2補數的表示法

既然第一種方法很糟糕,於是就有人想到使用2補數的表示法(可以想到真是天才)

這種方法是把負數轉成其正數的補數

什麼是補數?嗯.....就是互補的數

比如說4的補數是6,12的補數是88

下面舉一些例子

  • 4567(十進位)的10補數:10000-4567=5433
  • 4567(八進位)的8補數:10000-4567=3211(八進位)
  • 11001011(二進位)的2補數:100000000-11001011=110101(二進位)

(我不太會解釋補數的定義,但是你看例子大概可以有點感覺)

所以這可以幹嘛?——計算機科學家發現,N的二進位補數很適合用來表達-N

以4bit來說,5是0101,而0101的補數,也就是1011很適合用來表達-5

為什麼?——因為加法可以用

以4bit來說,5是0101,-5是1011,相加應該要是0

現在來做做看,0101+1011=10000,喔因為超過4bit了,所以會捨棄1,變成0000

剛好是0!

因此現在的電腦,基本都是用2補數表示法

例題

42:42的2補數表示法就跟原本一樣,把它換成二進位就好,也就是00101010

-63:-63會是63的2補數,也就是11000001

-128:-128會是128的補數,也就是10000000


上一篇
Day11:[計算機概論]ASCII根本不夠用!——Unicode的出現
下一篇
Day13:[計算機概論]Toy Machine:用組合語言寫加法
系列文
計算機概論X30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言