原码、反码和补码的概念
本节要求
掌握原码、反码、补码的概念
知识精讲
数值型数据的表示按小数点的处理可分为定点数浮点数;按符号位有原码、反码和补码三种形式的机器数。
一.计算机中数据的表示方法
1、数的定点与浮点表示
在计算机内部,通常用两种方法来表示带小数点的数,即所谓的定点数和浮点数。
    ①定点数:是小数点在数中的位置是固定不变的数,数的最高位为符号位,小数点可在符号位之后,也可在数的末尾,小数点本身不需要表示出来,它是隐含的。
    缺点:只有纯小数整数才能用定点数表示;
    ②浮点数:小数点在数中的位置是浮动的、不固定的数。
一般浮点数既有整数部分又有小数部分,通常对于任何一个二进行制数N,总可以表示成:
              N=±2P×S
    N、P、S均为二进制数,
为N的阶码,一般为定点整数,常用补码表示,阶码指明小数点在数据中的位置,它决定浮点的表示范围
N尾数,一般为定点小数,常用补码或原码表示,尾数部分给出了浮点数的有效数字位数,它决定    浮点数的精度,且规格化浮点数0.5|S|<
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/+ 1/8 )D  =( 2-1 + 2-2 + 2-3)D      ---------------------------
在计算机中表示一个浮点数其结构为:
                          阶码部分                尾数部分
阶符
阶数
尾符
尾数
Ef
E1E2Em
Sf
S1S2Sn
假设用八个二进制位来表示一个浮点数,且阶码部分占4位,其中阶符占一位;尾数部分占4位,尾符也占一位。
若现有一个二进制数N=(1011002可表示为: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为原码表示,则 S=1
规格化数
          S为补码表示    N为正数,则S1 =1
                          N为负数,则S1=0
    二、原码、反码和补码
1、机器数与真值
机器数:在计算机中数据和符号全部数字化,最高位为符号位,且用0表示正、1表示负,那么把包括符号在内的一个二进制数我们称为机器数,机器数: 有原码、反码和补码三种表示方法。
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011  
那么,这里的 00000011  10000011 就是机器数。
真值:用“+”、“”号表示的二进制数。
机器数因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值13110000011转换成十进制等于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位可表示的个数
二进制定点小数
十进制定点小数
原码
1111111101111111
-127+127
2n-1
1.11111110.1111111
-127/128+127/128
反码
1000000001111111
-127+127
2n-1
1.11111110.1111111
-127/128+127/128
补码
1000000001111111
-128+127
(-128)代替了(-0)
2n
1.11111110.1111111
-1-127/128
由此可见:n位的二进制数用原码表示,则可表示的数的个数为2n-1个;n位的二进制数用反码表示,则可表示的数的个数为2n1个;n位的二进制数用补码表示,则可表示的数的个数为n个。
比如:补码中用(-128)代替了(-0)
编程中常用到的32int类型,可以表示范围是: [-231 231 -1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值                -2G 2G -1
3、算术运算
计算机中的算术运算一般可采用补码进行,用补码表示的两个操作数进行算术运算,符号位可直接参加运算,结果仍为补码。
①定点补码加法运算
运算规则:[x+y][x]取补[y]
②定点补码减法运算
运算规则:[xy][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+1Cs
Cs+1用来表示两个符号位向更高位进位时的状态,有进位时Cs+1=1,无进位时Cs+1=0
Cs用来表示两数值的最高位向符号位进位时的状态,有进位时Cs=1,无进位时Cs=0
Cs+1Cs=0011时,无溢出;当Cs+1Cs=0110时,有溢出,当双符号位为01时正溢出,当双符号位为10时负溢出;
例如:[x]=10011100[y] =10011000,则[x+y]=        。溢出,因为Cs+1Cs=10故溢出逻辑表达式为VCs+1Cs
④无符号数的运算
无符号数的运算实际上是指参加运算的操作数XY均为正数,且整个字长全部用于表示数值部分。
当两个无符号数相加时,其值在字长表示的范围内,其结果为正数。
当两个无符号数相减时,其值的符号位取决于两数绝对值的大小。
另外,地址在计算机中用无符号数表示。
四原码反码补码再深入 
计算机巧妙地把符号位参与运算并且将减法变成了加法背后蕴含了怎样的数学原理呢?
将钟表想象成是一个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. 所以钟表往回拨(减法)的结果可以用往前拨(加法)替代

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。