掰扯一下補碼2

2022-08-03 16:39:18 字數 1714 閱讀 5055

上一次我們了解了補數,縮減基數補數以及其實現減法的原理。想要了解計算機是如何用加法運算來代替減法運算的。還需要繼續往下了解一下負數在計算機中是如何表示的。

上一次介紹的用補數實現減法運算的第二種方法,存在當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陣列的最尾處...