关于原码,补码的笔记

一,原码

  原码表示法规定:用符号位和数值表示带符号数,正数的符号位用 “0” 表示,负数的符号位用 “1” 表示,数值部分用二进制形式表示。

  如:

     在八位编码下,原码 取值从  -2^7+1~+2^7-1 

    x[原]=01111111    x= 2^7-1 

    x[原]=00000000  x=+0

    x[原]=10000000  x=-0

             x[原]=11111111   x=-2^7+1

  原码的缺陷:1,因为有着正0 和 负0,所以 原码只能表示 2^8-1 个数。

              2,正负原码无法直接相加,在计算机内部计算麻烦。因为要把符号位和数值位分开计算。

          如 2+(-1)= 1,但  00000010 +10000001=10000011 其真值为 -3

  因为原码有着这样的缺陷,所以在计算机内部,更常用的数值表示方法是补码。

二,补码

  补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后再加一

  如:

     在八位编码下,补码 取值从  -2^7~+2^7-1 

          设真值 x=1, y=--2,a=0

    则 [x]原=0000 0001  [x]补=0000 0001

        [y]原=1000 0010  [y]补=1111 1110

     [a]原=0000 0000  [a]补=0000 0000

  另外:

     由于计算机的定长 进位的话就被截掉了

     就是 b=-0    [b]原=1000 0000  本来  [b]补= 1 0000 0000 

      但 1 被截断 于是 [b]补=0000 0000  这样 +0 和 -0 就统一了

       于是  [n]补= 1000 0000  就空出来了       // n表示未知量  

     于是认为规定    [-128]补= 1000 0000  

在计算机中 正数表示形式 都是一样的  但 负数 却有三种表示方法:原码,反码,补码 

 三码之间的比较:

  其中 原码表示形式简单,适于乘除运算 (这个不太理解),

  但其加减运算就比较复杂了,因为要区分正负号 与数值部分,较为麻烦

  于是为了解决这个问题,引入了 反码和补码 ,

  反码和补码 其减法可以用加法实现  ,且 数的符号位可以和数值一样参与运算

  

  至于说反码和补码有什么区别的话,我个人认为 补码是反码的优化版

  其实 反码和补码 就差在那个 末位加一上,

  这一加 1,不仅统一了反码 +0和-0的问题,

  还扩大的反码数值表示范围 (其实也就多加了一个数)       

    

    

原文地址:https://www.cnblogs.com/asdfknjhu/p/12079122.html