目錄
前置知識
補碼的定義:
反碼的定義:
這是計算反碼的兩個例子:
補碼 = 反碼 + 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?
我所了解的,都在這篇文章裡面了,如果有錯誤的地方,歡迎指正!!!!
如果能幫到你,不妨給個贊👍? (逃~