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,最終結果,就是1111_1010
比較一下+6的二進制與-6的二進制

得出結論:-6的表示方法為+6的反碼+1,符號為1(正數的補碼就是原碼,負數的補碼就是符號位不動,其正數的反碼+1)
關于+6與-6的補碼相加運算就不展開驗證了,就當個作業吧,看到的在評論區自覺完成~,
附記:關于這些也是自己剛看的,一直好奇補碼的這種存盤方式,百度百科是以鐘表為例,其實本質都是一樣,當前任意值一直加加加,就會陷入回圈往復之中,早晚會與起始值相同,(byte最大值+1是0,因為溢位了~),
此篇結束也留下個疑問,為什么負數的補碼會與正數的反碼+1恰好相等,還是說我這種推導是錯誤的,
最后,如有紕漏,不吝賜教,
文章地址:https://www.cnblogs.com/haoxinxin/p/15613243.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/373632.html
標籤:ASP.NET
