资料来自百度文库:https://wenku.baidu.com/view/550e7af265ce0508763213b9.html

原码、反码和补码_经验分享

原码、反码和补码的概念

本节要求

掌握原码、反码、补码的概念

知识精讲

数值型数据的表示按小数点的处理可分为定点数浮点数;按符号位有原码、反码和补码三种形式的机器数。

一.计算机中数据的表示方法

1、数的定点与浮点表示

在计算机内部,通常用两种方法来表示带小数点的数,即所谓的定点数和浮点数。
    ①定点数:是小数点在数中的位置是固定不变的数,数的最高位为符号位,小数点可在符号位之后,也可在数的末尾,小数点本身不需要表示出来,它是隐含的。

    缺点:只有纯小数整数才能用定点数表示;
    ②浮点数:小数点在数中的位置是浮动的、不固定的数。

一般浮点数既有整数部分又有小数部分,通常对于任何一个二进行制数N,总可以表示成:

              N=±2P×S
    N、P、S均为二进制数,

为N的阶码,一般为定点整数,常用补码表示,阶码指明小数点在数据中的位置,它决定浮点的表示范围

 

为N的尾数,一般为定点小数,常用补码或原码表示,尾数部分给出了浮点数的有效数字位数,它决定 了浮点数的精度,且规格化浮点数0.5≤|S|<1

0.1B=( 1/2 )D              =( 2-1 )D

0.11B=(1/2 + 1/4 )D         =( 2-1 + 2-2 )D

0.111B=(1/2 + 1/4  + 1/8 )D  =( 2-1 + 2-2 + 2-3)D       ---------------------------

在计算机中表示一个浮点数其结构为:
                          阶码部分          尾数部分

阶符

阶数

尾符

尾数

Ef

E1E2…Em

Sf

S1S2…Sn

假设用八个二进制位来表示一个浮点数,且阶码部分占4位,其中阶符占一位;尾数部分占4位,尾符也占一位。

若现有一个二进制数N=(101100)2可表示为:2110×0.1011,则该数在机器内的表示形式为:

101100B=  10110B * (21)D

101100B=   1011B * (22)D

101100B=  101.1B * (23)D

101100B=  10.11B * (24)D

101100B=  1.011B * (25)D

101100B= 0.1011B * (26)D=0.1011B *  (2110)B

0

1

1

0

0

1

1

0

1

一个浮点形式的尾数S若满足0.5≤|S|<1,且尾数的最高位数为1,无无效的0,则该浮点数称为规格化数;规格化数可以提高运算的精度。

            S为原码表示,则 S1=1

规格化数

           S为补码表示    N为正数,则S1 =1

                           N为负数,则S1=0

    二、原码、反码和补码

1、机器数与真值

机器数:在计算机中数据和符号全部数字化,最高位为符号位,且用0表示正、1表示负,那么把包括符号在内的一个二进制数我们称为机器数,机器数 有原码、反码和补码三种表示方法。

比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 

那么,这里的 00000011 和 10000011 就是机器数。

真值:用“+”、“—”号表示的二进制数。

机器数因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 

例:0000 0001的真值 =   +000 0001 = +1,

    1000 0001的真值 =   -000 0001 = -1

 

    2、原码、反码和补码的概念

1)概念

机器数 有原码、反码和补码三种表示方法。

 

原码是最简单的机器数表示法。其数符位用0表示正,1表示负,其余各位表示真值本身。

      即用第一位表示符号, 其余位表示值,比如如果是8位二进制:

      1的原码是00000001

    1的原码是10000001

 

反码正数的反码同原码,    负数的反码为除符号位外,其它各位按位取反。

      正数的反码是其本身,  负数的反码是在其原码的基础上,符号位不变,其余各个位取反

      1的反码是00000001

        —1的反码是11111110

 

补码正数的补码同原码,负数的补码为反码加1。

                        负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1

      1的补码是00000001

    —1的补码是11111110

2)转换方法

真值为正数时,原码、反码、补码 3种机器数的最高位均为0

真值为负数时,原码、反码、补码 3种机器数的最高位均为1

 

机器数的最高位为符号位其它位称为数值位

 

真值为正数时,原码=反码=补码

真值为负数时,三种机器数的符号位相同,均为1,原码的数值位保持“原”样,反码的数值位是原码数值位的“按位取反”,补码的数值位是原码的数值位的“按位取反”后再加1,简称“取反加1”。

真值为负数时:补码 = 反码+1

真值为负数时:原码 = [补码]取补    补码 = [原码]取补 

                [-x]补= - [x]

                [x]补= - [-x]补     比如8bit,模= 28=1_0000_0000

 

 

例如:(1)假设码长为8位,写出下列数的原码、反码和补码。

根据本题可得到结论:0的原码、反码各有两种表示方法,而补码是唯一的全0表示。

真值

+0

-0

+1

-1

+127

-127

-128

原码

00000000

10000000

00000001

10000001

01111111

11111111

溢出

反码

00000000

11111111

00000001

11111110

01111111

10000000

溢出

补码

00000000

00000000

00000001

11111111

01111111

10000001

10000000

     (2)假设码长为8位,写出原码、反码和补码所能表示定点整数和定点小数的范围。

 

二进制定点整数

十进制定点整数

n位可表示的个数

二进制定点小数

十进制定点小数

原码

11111111~01111111

-127~+127

2n-1个

1.1111111~0.1111111

-127/128~+127/128

反码

10000000~01111111

-127~+127

2n-1个

1.1111111~0.1111111

-127/128~+127/128

补码

10000000~01111111

-128~+127

(-128)代替了(-0)

2n个

1.1111111~0.1111111

-1~-127/128

由此可见:n位的二进制数用原码表示,则可表示的数的个数为2n-1个;n位的二进制数用反码表示,则可表示的数的个数为2n-1个;n位的二进制数用补码表示,则可表示的数的个数为2n个。

比如:补码中用(-128)代替了(-0)

编程中常用到的32位int类型,可以表示范围是: [-231 ~ 231 -1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值                -2G ~ 2G -1

3、算术运算

计算机中的算术运算一般可采用补码进行,用补码表示的两个操作数进行算术运算,符号位可直接参加运算,结果仍为补码。

①定点补码加法运算

运算规则:[x+y]补=[x]取补+[y]补

②定点补码减法运算

运算规则:[x-y]补=[x+(-y)]补=[x]补+[-y]补

[y]的求法是将[y]的各位(包括符号位)全取反,最末位加1。

即将[y]连同符号位一起取反加1便可得到[y]

[-x]补=模 - [x]补

    [x]补=模 - [-x]补 比如8bit,模= 28

如:

[y]=10001010,则[y]=01110110;    [-1]补=28 - [1]补=1_0000_0000 - 0000_0001 = 1111_1111

[y]=0100,则[y]=1100;        [-(-1)]补=28 - [-1]补=1_0000_0000 - 1111_1111 = 0000_0001

注意:在进行运算时有时会发生溢出。

   ③定点补码运算的溢出处理

采用补码运算时若结果的数值超出了补码所能表示的范围,则此种情况称为溢出。

若计算结果比能表示的最大数还大则称为上溢,上溢时一般作溢出中断处理;

若计算结果比能表示的最小数还小则称为下溢,下溢时一般作机器零处理。

下面介绍用双符号判断溢出方法:

引入两个符号位Cs+1、Cs

Cs+1用来表示两个符号位向更高位进位时的状态,有进位时Cs+1=1,无进位时Cs+1=0;

Cs用来表示两数值的最高位向符号位进位时的状态,有进位时Cs=1,无进位时Cs=0;

当Cs+1Cs=00或11时,无溢出;当Cs+1Cs=01或10时,有溢出,当双符号位为01时正溢出,当双符号位为10时负溢出;

例如:[x]=10011100,[y] =10011000,则[x+y]=         。溢出,因为Cs+1Cs=10。故溢出逻辑表达式为V=Cs+1Cs

 

④无符号数的运算

无符号数的运算实际上是指参加运算的操作数X、Y均为正数,且整个字长全部用于表示数值部分。

当两个无符号数相加时,其值在字长表示的范围内,其结果为正数。

当两个无符号数相减时,其值的符号位取决于两数绝对值的大小。

另外,地址在计算机中用无符号数表示。

 

四原码, 反码, 补码再深入 

计算机巧妙地把符号位参与运算, 并且将减法变成了加法, 背后蕴含了怎样的数学原理呢?

将钟表想象成是一个1位的12进制数. 如果当前时间是6点, 我希望将时间设置成4点, 

我们可以: 

1. 往回拨2个小时: 6 - 2 = 4 

2. 往前拨10个小时: (6 + 10) mod 12 = 4 

3. 往前拨10+12=22个小时: (6+22) mod 12 =4 

 

2,3方法中的mod是指取模操作, 16 mod 12 =4 即用16除以12后的余数是4. 所以钟表往回拨(减法)的结果可以用往前拨(加法)替代! 

现在的焦点就落在了如何用一个正数, 来替代一个负数. 上面的例子我们能感觉出来一些端倪, 发现一些规律. 但是数学是严谨的. 不能靠感觉. 首先介绍一个数学中相关的概念: 同余

 

 

“模”是指一个计量系统的计数范围

例如:时钟的计量范围是0~11,模=12。

表示n位的计算机计量范围是0~2n -1,模=2n

“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。

比如:时钟(模=12)中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替

 

对时钟(模=12)而言,8和4互为补数。

以12模的系统中,11和1;10和2;9和3;7和5;6和6都互为补数。共同的特点是两者相加等于模

对于计算机,其概念和方法完全一样。

n位计算机,设n=8, 所能表示的最大数是11111111,若再加1称为100000000(9位)

但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为28。

在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。

[-x]补=模 - [x]补

    [x]补=模 - [-x]补 比如8bit,模= 28

    [-1]补=28 - [1]补=1_0000_0000 - 0000_0001 = 1111_1111

 [-(-1)]补=28 - [-1]补=1_0000_0000 - 1111_1111 = 0000_0001

 

把补数用到计算机对数的处理上,就是补码

 

负数取模

x mod y = x - y*int( x / y )

                int( x / y ) VB语法表示:不大于(x/y)的最大整数,即向下取整

                int(-1.5)=-2

                Fix(-1.5)=-1

举例: -3 mod 2 = -3 - 2*int(-3/2) = -3 - 2*(-2) = -3 - 2x(-2)=1

 

同余的概念

两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余

记作 a ≡ b (mod m) 读作 a 与 b 对于模 m 同余

举例说明: 4 mod 12 = 4 ; 16 mod 12 = 4 ; 28 mod 12 = 4 

所以4, 16, 28对于模 12 同余.

两个定理:

1、反身性: 

a ≡ a (mod m)  自己和自己 对于模m同余

 

2、线性运算定理:

如果a ≡ b (mod m),c ≡ d (mod m)

那么:

(1)a ± c ≡ b ± d (mod m)

(2) a * c ≡ b * d (mod m) 

3、传递

若a≡b (mod m),b≡c (mod m),则a≡c (mod m)

 

典型例题

一、 选择题

1、一个四位二进制补码的表示范围是(     )

A、0~15    B、-8~7     C、-7~7     D、-7~8

2、(10题)十进制数-48用补码表示为(     )

   A、10110000    B、11010000       C、11110000      D、11001111

分析:求某个负数的补码,可利用模的定义,所以求-48的补码,只需求-80的原码即可,因为-48+(-80)=-128,而[-80]原=11010000,故选B,注,传统做法是在原码的基础上“取反加1”。

答案:B

3、(09年镇江三模)如果X为负数,由[x]补求[-x]补是将(     )

A、[x]补各值保持不变                  B、[x]补符号位变反,其他各位不变

C、[x]补除符号位外,各位变反,末位加1

D、[x]补连同符号位一起各位变反,末位加1

分析:不论X是正数还是负数,由[X]补求[-X]补的方法是对[X]补求补,即连同符号位一起按位取反,末位加1。

答案:D

二、 判断题

1.计算机中一个浮点数N可用±2P×S表示,那么用规格化数表示,则尾数S必须满足0.5≤|S|<1。

【答案】对

【解题指导】一个浮点形式的尾数S若满足0.5≤|S|<1,且尾数的最高位数为1,无无效的0,则该浮点数称为规格化数;规格化数可以提高运算的精度。

三、 填空题

1.二进制数0.011011的规格化数为 1111111101101100 ,二进制数-11011的规格化数为   0000010110010100 。(尾数、阶码均用8位二进制补码表示)

分析:0.011011可表示为0.11011×2-1,即规格化数为0.11011×2-1

      -11011可表示为-0.11011×25,即规格化数为0.11011×2101

2、已知X、Y为两个有符号数的定点整数,它们的补码为:[x]补=00010011B,[y]补=11111001B,则[X+Y]补=             B。

分析:[X+Y]补=[X]补+[Y]补,X为正数,Y为负数,故列式结果不溢出为00001100。

答案:00001100

原码、反码和补码的概念当堂练习

一、选择题

(   )1、机器数80H所表示的真值是-128,则该机器数为        形式的表示。

A、原码            B、反码          C、补码            D、移码

(   )2、在浮点数中,阶码、尾数的表示格式是            

   A、阶码定点整数,尾数定点小数       B、阶码定点整数,尾数定点整数

C、阶码定点小数,尾数定点整数       D、阶码定点小数,尾数定点小数

(   )3、已知[x]补=10110111,[y]补=01001010,则[x-y]补的结果是            

   A、溢出           B、01101010      C、01001010        D、11001010

(   )4、某机字长8位,含一位数符,采用原码表示,则定点小数所能表示的非零最小正数为     

   A、2-9                    B、2-8                  C、-1              D、2-7

(   )5、(08年)下列数中最小的数是____C____。

A.[10010101]原 B.[10010101]反 C.[10010101]补 D.[10010101]2

(   )6、(12年)8位补码表示的定点整数的范围是  B     

   A、-128~+128        B、-128~+127      C、-127~+128    D、-127~+127

(   )7、(11年盐城二模)已知X的补码为10110100,Y的补码为01101010,则X-Y的补码为        

A) 01101010       B) 01001010      C) 11001010    D) 溢出

(   )8、将-33以单符号位补码形式存入8位寄存器中,寄存器中的内容为(     )。

A.DFH         B.A1H         C.5FH         D.DEH

(   )9、在机器数的三种表示形式中,符号位可以和数值位一起参加运算的是(  )

A)原码      B)补码      C)反码       D)反码、补码

二、判断题

(   )1、16位的补码表示的定点整数的最小值是-32768。

(   )2、(10年南京二模)一个数在计算机中分别用原码、反码、补码表示时一定各不相同。

(   )3、(10年常州三模)字长相同,定点法表示数的范围比浮点法小。

(   )4.若用八位二进制数来表示一个有符号数,则原码、反码和补码表示的数的个数与范围均相同。

三、填空题

1、十进制数-27对应的8位二进制补码为             

2、(11年)已知X、Y为两个带符号的定点整数,它们的补码为:[X]补=00010011B,[Y]补=11111001B,则[X+Y]补 =     00001100    B。

3、数x的真值为-0.1011B,其原码表示为             ,补码表示为             

4、八位定点整数,采用二进制补码表示时,所能表示真值的十进制数的范围是             。 

5、(09年)已知[X]补=01110111B,[Y]补=01100010B,则[X-Y] 补=______00010101__________。

6、(11年)一个含有6个“1”、2个“0”的八位二进制整数原码,可表示的最大数为      7EH       。(用十六进制表示)

7、(12年)已知[X]补=10000000B,则X= -10000000  B。

8、(10年盐城二模)二进制数10110000,若看成纯小数,且为补码,则其对应真值的十进制数是________。

原码、反码和补码的概念课后练习

一、选择题

(   )1、(10年盐城二模)“溢出”一般是指计算机在运算过程是产生的   _____ 。

A、数据量超过内存容量           B、文件个数超过磁盘目录区规定的范围

C、数据超过了机器的位所能表示的范围     D、数据超过了变量的表示范围

(   )2、设有二进制数X=-1101110,若采用8位二进制数表示,则[X]补的结果是      

      A、11101101        B、10010011      C、00010011        D、10010010

(   )3、假设有一个16机的某存储单元存放着数1101101101001000,若该数作为原码表示十进制有符号整数(其中最高位为符号位)时,其值为             

       A、-55510            B、-23368           C、-18762        D、56136

(   )4、计算机内的数有浮点和定点两种表示方法。一个浮点法表示的数由两部分组成,即   。 

A)指数和基数       B) 尾数和小数     C) 阶码和尾数       D) 整数和小数 

二、判断题

(   )1.负数的补码就是原码逐位取反后的结果。

(   )2.[X]补是一个正数还是一个负数,是根据[X]补的符号位是“0”还是“1”确定的。

三、 填空题

1、(11年盐城二模)已知[X]补=11111111,X对应的真值是        -1             

2、已知[x]补=10111011,[y]补=01101101,则[x+y]补=__________

3、(10年南京二模).已知[X]补=10000000B,则X=        (十进制)。

第二节 数制及数制的转换巩固练习

一、选择题

1.(1110)2×(1011)2=———。

A)11010010 B)10111011 C)10110110 D)10011010

2.十六进制数(AB)16变换为等值的八进制数是____。

A)253 B)35l C)243 D)101

3.下列数中最大的数是             

A)(227)8 B)(1FF)16 C)(10100001)2 D)(1789)10

4.十进制数87转换成二进制数是             

A)(1010111)2 B)(1101010)2 C)(1110011)2 )D、(1010110)2

5.十进制数1385转换成十六进制数为       

A)568 B)569 C)D85 D)D55

6、(12年)下列不同进制数中最大的数是   D          

A、10111001B           B、257Q           C、97D               D、BFH

二、判断题

(   )1、1000H是1000Q的2倍,因为16是8的2倍。

(   )2.十进制数要转换成十六进制数必须先转换为二进制数然后再由二进制数转换成十六进制数。

(   )3.计算机中也可以直接处理十六进制数。

三、填空题

1.将一个十进制整数转换为二进制数,采用             的方法,将所有的余数按照先后顺序组合的一起即可,而将一个纯小数转换为二进制数则可采用             的方法,然后将所有的整数按照一定顺序组合在一起。

2、(09年)十进制数25.1875对应的二进制数是____11001.0011

3、一个二进制整数右端加上三个零,形成的新数是原数的               倍。

4.八进制数37.4O转换成二进制数为