上一次我們了解了補數,縮減基數補數以及其實現減法的原理。想要了解計算機是如何用加法運算來代替減法運算的。還需要繼續往下了解一下負數在計算機中是如何表示的。
上一次介紹的用補數實現減法運算的第二種方法,存在當y大於x時,結果是錯誤的問題,例如123-456=123+543+1=667。這顯然不對。
要解決這個問題,就必須引入負數的表示方法。在10為基數,位數為三的情況下,可以表示的正數是0到999,但也可以表示
-500到499。這樣,667可以是-333(1000-667),就是正確答案了。
下面的圖來幫助理解這種表達方式,把數軸的直線連城圓,當然是有限個數的軸,比如三位數。在負數的表達方式中,負數的絕對值加上其表示的正數就等於b的n次方。|-1| + 999 = 1000,|-500| + 500 =
1000。這種方法可以稱之為環形表示吧。
計算機的負數表示方式--2補數
計算機是2進製的,實現上有幾種表示負數的方法,目前廣泛採用的就是2補碼。
必須先介紹一下1補數的實現。以最高位為符號位,1代表負數,所有負數都是其對應正數的每一位取反。例如八位二進位制數,1000 0000 可以由其對應正數0111 1111每一位取反得到,其表示的是-127。這種方法有乙個問題,就是1111 1111表示的是-0,和0000 0000 加起來整個系統中有兩個0。下表來自維基百科,可以幫助大家理解這種表示方法。
2進製數
1補數數
無符號數
00000000+00
0000000111
⋮⋮⋮01111101
125125
01111110
126126
01111111
127127
10000000
−127
12810000001
−126
12910000010
−125
130⋮⋮⋮
11111101
−2253
11111110
−1254
11111111
−0255
2補數可以解決這個問題。2補數是在1補數的基礎上,取反後再加1。於是1111 1111表示的是-1,因為1的二進位製取反為1111 1110,加1後得到1111 1111。其中-128為1000 0000取反後為0111 1111,加1後得到
1000 0000。這種方法和上面介紹的環形表示法的方式一致。
2進製數
2補碼數
無符號數
0000000000
0000000111
⋮⋮⋮01111110
126126
01111111
127127
10000000
−128
12810000001
−127
12910000010
−126
130⋮⋮⋮
11111110
−2254
11111111
−1255
可以發現在2進製數中,取反就相當於縮減基數補數啊。2補數又在此基礎上加了1,這就和之前介紹的補數的減法計算的第二種方法一致。如0111 1111 + 1000 0000 = ?
本人水平有限,但是歡迎指正交流。
如果你覺得有點意思,歡迎關注 悟空的小車庫。
邁向HTML5的路上,蘋果扯了一下Google的蛋
蘋果對本地應用的死忠正是web之王google的矛頭所指。乙份分析指出,web和html5將在接下來的四年裡面將蘋果的經營利潤削掉30 因為應用開發者們正在開發跨裝置的基於瀏覽器的應用。但問題在於google由於其移動戰略布局了android,因此在html5方面依然顯示出一種弱標準服從者的樣子。g...
邁向HTML5的路上,蘋果扯了一下Google的蛋
蘋果對本地應用的死忠正是web之王google的矛頭所指。乙份分析指出,web和html5將在接下來的四年裡面將蘋果的經營利潤削掉30 因為應用開發者們正在開發跨裝置的基於瀏覽器的應用。但問題在於google由於其移動戰略布局了android,因此在html5方面依然顯示出一種弱標準服從者的樣子。g...
python列表的複製,扯一下淺拷貝與深拷貝的區別
將乙個列表的資料複製到另乙個列表中。使用列表 可以呼叫copy模組 import copy a 21,22,23,24,a b c d 25,26 b a 直接賦值 c a 淺拷貝d copy.copy a 淺拷貝e copy.deepcopy a 深拷貝 看看深拷貝與淺拷貝的區別 在a陣列的最尾處...