关于原码,补码的笔记

一,原码

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

  如:

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

    x[原] = 0111 1111    x= 2^7-1 

    x[原] = 0000 0000   x=+0

    x[原] = 1000 0000   x=-0

              x[原] = 1111 1111     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

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

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

 

  另外:补码中 +0 和 -0 的补码是相同的。设  a = +0,b = -0

       由于 a 是正数,所以补码与原码相同,所以 

       [a]补 = 0000 0000

     而 [b]原=1000 0000  本来  [b]补= 1 0000 0000 ,

     但由于计算机的定长,进位的话就被截掉了,所以 1 被截掉了,于是

       [b]补 = 0000 0000 

     这样 +0 和 -0 就统一了。

 

  发现:由于  +0 和 -0 共用相同的补码,所以相对原码来说,就多了一个不用的补码:

        [n]补 = 1000 0000

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

 

三,比较 

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

   三码之间的比较:

    其中 原码表示形式简单,适于乘除运算 ,

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

 

  于是为了解决减法,引入了 反码和补码,

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

 

  至于说反码和补码有什么区别的话, 可以将补码认为是反码的优化版。

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

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

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

 

    

 ========== ========= ======== ======= ====== ===== ==== === == =

   春宵  宋 苏轼

春宵一刻值千金,花有清香月有阴。

歌管楼台声细细,秋千院落夜沉沉。

 

    

posted @ 2019-12-22 10:03  叫我妖道  阅读(399)  评论(0编辑  收藏  举报
~~加载中~~