二進制負數的補碼爲什麼是符號位不變,其他位取反加一?

今天看了《邏輯設計基礎》才明白了爲什麼二進制負數的補碼是符號位不變,其他位取反加一

1. 什麼是補碼?

補碼:計算機是用來將減法轉換成加法的一種手段,在計算機系統中,數值一律用補碼來表示和存儲。

2. 如何求補碼?

  • 如何求解一個補碼,就要先涉及到的概念,那麼什麼是呢?

“模”是指一個計量系統的計數範圍。比如說:對於 1 位十進制數字,它的範圍是:0-9,那麼它的模就是 10

模可以理解爲當前空間所能表示的最大的數字再加一,再比如對於 3 位二進制數,它能表示的最大數字爲 111,

那麼它的模就是 1000,比它能表示的最大數字加一。

  • 那麼對於補碼又有什麼作用呢?

首先強調一下,正數的補碼=正數本身,負數的補碼需要進行計算

  • 那麼負數補碼又和有什麼關係呢?

負數的補碼 = (-)【模 - (負數的絕對值) 】

這裏的絕對值就是相當於忽略掉原來的數字符號,將負數當成它的相反數正數來計算,再將符號位填到結果前面

比如說:對於一個爲 10 的 -2(原),它的補碼就爲 (-) 8 (補)

對於二進制數字來說,第一個位用來表示符號,0 表示正數,1 表示負數

那麼對於帶符號位的四位二進制來說:

0111(原) 的補碼=0111(補)(因爲 0 表示正數,正數的補碼是它本身)

1001(原) 的補碼=1111(補)(因爲 1 表示負數,負數的補碼=(-)【模-(負數的絕對值)】= (-)【1000-011】)

3. 那麼跟你的標題有毛線的關係?

彆着急,咱們慢慢來,標題上說的是:負數的二進制補碼=符號位不變其它位取反加一

咱們先來看一個例子(就是上面的例子):對於四位二進制來說,第一個位表示符號,0表示正數,1表示負數

0111(原) 的補碼 = 0111(補)

1001(原) 的補碼 = 1111(補),我們嘗試一下,全反加一的操作

1. 1 001(原)符號位不變,先取反得:1 110(反)

2. 再加一,1 110 + 1 = 1111(補)

4. 咦!真得上面的數欸,爲什麼取反加一就等於模減去負數的相反數呢,好神奇欸? 

嘿嘿,其實真滴是蠻神奇的,神奇就神奇在這是二進制!

先說個例子,對於三位二進制數:111 來說,它減去任何的三位二進制數都等於減去的三位二進制數的相反數!

真的這麼神奇嗎?

嘿嘿,我們來簡單舉個例子:111 - 101 = 010,010 是 101 的取反操作

111 - 010 = 101,101 是 010 的取反操作

哇哦,神奇吧,其實還行,1 - 1 = 0,1 - 0 = 1,這個就是裏面的原理!

  • 你上面說的這個和 4.主題有什麼關係呢?

這關係可大了!模是什麼?模是能表示的最大數加一,那麼對於任何N位二進制的數(不包含符號位),它的模是:2^N

那麼它的最大值是多少呢?當然是 2^N - 1 啦,對於 3 位二進制數,它的模是 2^3 = 8,它的最大值是 2^3 - 1 = 7 也就是 111

  • 這下懂了嗎?

計算 1 001 的補碼就相當於先用 模-1 得到最大值 111,再用 111 - 001 = 110,再加上 1,就相當於用 模(1000) - 001 啦!

最後得到的 110,再補上符號位1,得 1110

5. 最後算兩道題目

1111 + 0110 = ?

1011 + 1001 = ?

6. 突然又不明白負數的補碼化成原碼也是取反再加一了?

這其實和原碼化成補碼是一個道理!

咱們舉個例子就懂了,對於模爲10的一位十進制數字(不包含符號位),- 4(原),它的補碼爲 - 6(補)

補碼如何計算的?負號先放一邊,10 - 4 = 6,再加上負號得 -6(補)

那麼從 -6(補)變回原碼如何辦?那也是相同的操作呀!將負號放一邊,10 - 6 = 4,再加上負號得 -4

這樣不就得到了 -6(補)的原碼 -4(原)了呀!

其實聰明的讀者已經想到了,這樣有可能會導致溢出,正數加正數可能會出現負數,負數加負數可能會出現結果爲正數!這又是怎麼一回事呢?詳情請看下回分解!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章