天天看點

補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題

目錄

前置知識

補碼的定義:

反碼的定義:

這是計算反碼的兩個例子:

補碼 =  反碼 + 1  為何成立(針對負數)

步入正題

補碼的意義

為何補碼的符号位能參與運算

為何補碼的最高位經常“被稱作”符号位呢?

總結

最後

前置知識

補碼的定義:

所謂補碼,英語裡又叫two's complement(對2求補),這個2指的是計數系統的容量(模),就是計數系統所能表示的狀态數。比如  "1位符号位 + 4位數值位",那麼容量(模)就是
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
因為 非負數是[0,
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
- 1],  負數是[ -
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
 + 1, 0), 然後還有一個 -0,一共就是
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
個;或者“暫時抛棄符号位”這一說法,5位二進制數表示的數最多就是
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題

是以,[x]補  = (

補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
+ x) % 
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
         %x  <=>  模x

反碼的定義:

所謂反碼,英語裡又叫ones' complement(對1求補),這裡的1,本質上是一個有限位計數系統裡所能表示出的最大值,在8位二進制裡就是11111111,在1位十進制裡就是9,在3位十六進制裡就是FFF(再大就要進位了)。求反又被稱為對一求補,用最大數減去一個數就能得到它的反,很容易看出在二進制裡11111111減去任何數結果都是把這個數按位取反,0變1,1變零,是以才稱之為反碼

是以,[x]反 = (

補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
- 1 + x) % (
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
- 1)

這是計算反碼的兩個例子:

補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題

補碼 =  反碼 + 1  為何成立(針對負數)

由上,

[x]補  = (

補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
+ x) %
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
[x]反 = (
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
- 1 + x) % (
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題

- 1)

可推出,補碼 = 反碼 + 1 成立

補碼 = 反碼 + 1 隻是一種求補碼的方式,并不是定義,是由補碼和反碼的定義推出來的

步入正題

補碼的意義

由上可知,[x]補 = (
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
+ x) %
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
推廣到一般,就是  [x]補 = (
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
+ x) %
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題

       (n是數值位的位數)

拿經典的鐘表為例

假設時針現在指在了3點的位置,我要讓指針指向12點,那麼我有兩種選擇(如果規定逆時針為負)

1、逆時針轉3格 (-3)

2、順時針轉9格(+9)

那麼,-3和+9就起到了相同的作用,二者效果一樣,都是從3點到12點

那麼二者有什麼關系呢?

其實二者互為補碼(%12)      12恰好是計數系統的容量(即鐘表最多表示12個數)

那麼在 %12 的情況下,9 就可以 "代替 -3" 運算

如  (8 - 3)% 12 = 5 % 12 = 5           (8 + 9) % 12 = 17 % 12 = 5

是以,補碼的用處就是:   減一個數  等價于  加上這個負數的補碼

那麼就不用進行減法運算了,隻要會加法就行

是以,補碼的意義就是把負數變成它“對應的正數”,然後參與運算

為何補碼的符号位能參與運算

首先,放上結論:補碼根本就沒有符号位   

至于為什麼,且聽我細細道來!!

根據上面的推導可知,補碼就是把負數轉換成正數然後參與運算

也就是說,補碼都是正數(敲黑闆~~~)

都是正數,那麼就沒有必要區分正負了啊,也就不需要符号位了,是以補碼沒有符号位

拿-2為例

[-2]原 = 1 0010        [-2]補 = 11110

如我所說,沒有符号位,那麼11110就是30,也就是說  -2的補碼是30 (%

補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題

),這顯然是正确的,是以我上面的結論是正确的(自導自演了,哈哈哈哈)

是以,補碼既然都沒有符号位(都是數值位,最高位也是),那拿來運算就是理所當然的啦!!!

為何補碼的最高位經常“被稱作”符号位呢?

正數的補碼等于其本身,那麼補碼的最高位自然就是0

計算負數的補碼時

用這個公式:[x]補  = (

補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題
+ x) % 
補碼的符号位為什麼能參與運算(看這一篇就夠了,絕對通俗易懂!!!)前置知識步入正題

計算得到的補碼最高位剛好為1

是以,事實情況是

補碼的最高位 和 原碼的符号位(最高位)  是一樣的

我們知道,補碼是看不出一個數的真實值的,需要轉換成原碼才能計算出

現在又有了,補碼的最高位和原碼的最高位一樣,而原碼的最高位又表示正負

是以,就可以拿補碼的最高位快速判定一個數的正負

然後,可能就有人發現了這個“巧合”,但是又不明白原理,就把補碼的最高位當作符号位了,然後就給我們這些小白留下了無盡的困惑(QWQ)

總結一句話就是:補碼的最高位能起到顯示正負的功能(隻是能起到符号位的功能),但不是真正的符号位,而是如假包換的數值位

總結

一定要從定義出發,搞清楚因果關系,由因 -> 果;如果搞不明白,就很容易弄混淆了,然後開始懷疑人生?(我可是亂說的啊,hhh)

我在大一下學期上那個電子技術基礎的時候,還在課堂上講過這些(還得感謝梁老師給的機會,哈哈哈),其實那時候也是半懂的狀态給大家講,也不知道其他同學有沒有聽明白(逃~);然後這學期學計組,又遇到了這個難題(自我覺得很難!!)。反正總是要弄明白的,逃也逃不掉,是以花了兩三天的時間,上網搜了很多别人的講解,然後綜合一下,自己再加以思考,結果就是了解的更深刻了,思路也更清晰了;至少現在,如果有人問我這個問題,我能面對面地把這個問題給他(她?)講明白

僅僅在邏輯上給出證明而不能從直覺上把握感覺的話,證了也白證,心裡還是很慌覺得知識不屬于我         ---華為某大佬

作為一個工科生,基本的數學原理是需要搞明白的,不然總會覺得不舒服         ----交大某大佬

最後

這篇blog應該是我花的時間最多的啦,差不多4h?

我所了解的,都在這篇文章裡面了,如果有錯誤的地方,歡迎指正!!!!

如果能幫到你,不妨給個贊👍? (逃~

繼續閱讀