1. 二進位制與十進位制
1. 1-原碼
原碼(true form)是一種計算機中對數字的二進位制定點表示方法。原碼錶示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其餘位表示數值的大小。(-百度百科)
缺點:不能直接參與運算,對於值相等的正負數字相加,往往得不到結果‘0’。如0000_1110(14)+1000_1110(-14)=1001_1100。
1. 2-反碼
反碼通常是用來由原碼求補碼或者由補碼求原碼的過渡碼。反碼跟原碼是正數時,一樣;負數時,反碼就是原碼符號位除外,其他位按位取反。(-百度百科)
1. 3-補碼(原碼反碼沒啥好說的,重點是這裡)
1. 3.1-為嘛要選擇這麼麻煩的記錄方式
要說這個問題,就要回到原碼中,因為原碼不能直接參與運算,例如在日常中-4+4的結果是0,但是換成原碼相加,則結果肯定不是0,不管你是否忽略掉符合位。
那麼,如何記錄數字?(-百度百科)
先說一個問題,如何讓指標指向0點(以時鐘為例,時鐘是12進位制,也更好理解,下圖我自己將12該成0,這樣更符合計算機中的數字)
答案是兩種:
順時針撥動4個小時和逆時針波動8個小時。分別代表了兩種運算{8點鐘加4小時}與{8點中減8小時},即8+4=8-8。然後就可以知道,4等價於-8。
順便多一句,你可能對於順時針的撥動的“4”,是不加思考,由生活經驗直介面算出來的,這個“4”其實就是鐘錶上的數字個數(12,0-11是12個數字)減去當前值(8)得出的 8+(12-8)。
進一步推到,上面的4等價於-8,得到12-8=-8。
ok,有了這些資訊,下一步就用到計算機儲存中。 以byte為例,規定一下符號位在最高為,0正1負,那我們還剩下7個位元組可以儲存。 假如要儲存-6,根據上面例子推出的,其實也可以儲存 **byte的能表示的數字個數(111_1111+1)-6**,用原碼運算一下,就是下圖
切記切記 到這裡還沒有完,別忘了,上圖中的被減數是byte的能表示的數字個數,但是理應是byte的能表示的數字個數+1,所以我們要在結果上在加1。
最終,再加上符號位1,最終結果,就是1111_1010
比較一下+6的二進位制與-6的二進位制
得出結論:-6的表示方法為+6的反碼+1,符號為1(正數的補碼就是原碼,負數的補碼就是符號位不動,其正數的反碼+1)
關於+6與-6的補碼相加運算就不展開驗證了,就當個作業吧,看到的在評論區自覺完成~。
附記:關於這些也是自己剛看的,一直好奇補碼的這種儲存方式,百度百科是以鐘錶為例,其實本質都是一樣,當前任意值一直加加加,就會陷入迴圈往復之中,早晚會與起始值相同。(byte最大值+1是0,因為溢位了~)。
此篇結束也留下個疑問,為什麼負數的補碼會與正數的反碼+1恰好相等,還是說我這種推導是錯誤的。
最後,如有紕漏,不吝賜教。
文章地址:https://www.cnblogs.com/haoxinxin/p/15613243.html