今天看了《邏輯設計基礎》才明白了爲什麼二進制負數的補碼是符號位不變,其他位取反加一
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(原)了呀!
其實聰明的讀者已經想到了,這樣有可能會導致溢出,正數加正數可能會出現負數,負數加負數可能會出現結果爲正數!這又是怎麼一回事呢?詳情請看下回分解!