二進制中的原碼反碼補碼
二進制中的原碼、反碼、補碼
1. 原碼
原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值. 比如如果是8位二進制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符號位. 因為第一位是符號位, 所以8位二進制數的取值範圍就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原碼是人腦最容易理解和計算的表示方式.
2. 反碼
反碼的表示方法是:
正數的反碼是其本身
負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可見如果一個反碼表示的是負數, 人腦無法直觀的看出來它的數值. 通常要將其轉換成原碼再計算.
3. 補碼
補碼的表示方法是:
正數的補碼就是其本身
負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最後+1. (即在反碼的基礎上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
對於負數, 補碼表示方式也是人腦無法直觀看出其數值的. 通常也需要轉換成原碼在計算其數值.
對於有符號數而言:
(1)二進制的最高位是符號位:0表示正數,1表示負數
(2)正數的原碼、反碼、補碼都一樣;
(3)負數的反碼 = 它的原碼符號位不變,其他位取反(0 ->1 ; 1->0 );
(4)負數的補碼 = 它的反碼 +1;
(5)0的反碼、補碼都是0;
(6)在計算機運算的時候,都是以補碼的方式來運算的;
例子:
下面我們就使用“有符號數”來模擬一下,在計算機中是怎樣運算的。
(1)正數相加:
例如:1+1 ,在計算機中運算如下:
1的原碼為:
00000000 00000000 00000000 00000001
因為“正數的原碼、反碼、補碼都一樣”,所以,1的補碼 = 1的原碼,所以 1的補碼+ 1的補碼 就等於:
00000000 00000000 00000000 00000001
+
00000000 00000000 00000000 00000001
=
00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000010( 轉換為10進制) = 0*2^0 + 1*2^1 = 0 + 2 =2
(2)正數相減:
例如:1-2,在計算機中運算如下:
在計算機中減運算其實是作為加運算來操作的,所以,1-2 = 1 + ( -2 )
第一步:把 1補碼找出來(因為正數的原碼、反碼、補碼都一樣,所以我們可通過原碼直接獲取補碼):
1的補碼:
00000000 00000000 00000000 00000001
第二步:把-2的原碼找出來:
-2的原碼:
10000000 00000000 00000000 00000010
第三步:把-2的反碼找出來:
-2的反碼:
11111111 11111111 11111111 11111101
第三步:把-2的補碼找出來:
-2的補碼:
11111111 11111111 11111111 11111110
第四步:1的補碼與-2的補碼相加:
00000000 00000000 00000000 00000001
+
11111111 11111111 11111111 11111110
=
11111111 11111111 11111111 11111111
第五步:將計算結果的補碼轉換為原碼,反其道而行之即可(如果想將二進制轉換為十進制,必須得到二進制的原碼)
補碼:11111111 11111111 11111111 11111111
=
反碼:11111111 11111111 11111111 11111110
=
原碼:10000000 00000000 00000000 00000001
第六步:將計算結果的二進制原碼 轉換 為十進制
二進制原碼:10000000 00000000 00000000 00000001 = 1*2^0 = -1
--------------------- 本文來自 realnewdream 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/dabing69221/article/details/17333743?utm_source=copy
二進制中的原碼反碼補碼