zoukankan      html  css  js  c++  java
  • 二进制中的原码反码补码

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

    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 

  • 相关阅读:
    Eclipse配置Maven详细教程
    Spring MVC 搭建web项目示例
    C# Action 和Func
    C# params 用法简介
    WPF绘图性能问题
    C# EventWaitHandle用法
    C#5.0 异步编程async/await用法
    通过Struts2Web应用框架深入理解MVC
    Java过滤器—Filter用法简介
    WPF内嵌CEF控件,与JS交互
  • 原文地址:https://www.cnblogs.com/xuange1/p/9747013.html
Copyright © 2011-2022 走看看