二进制中的原码反码补码

二进制中的原码、反码、补码

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 

猜你喜欢

转载自www.cnblogs.com/xuange1/p/9747013.html