原码,反码,补码,移码

 

移码的定义是怎么样的〉   

零距离 发表于 2006-2-21 09:05

晕了...看来你的书还是看少了...
[quote]
移码的定义为:2的n次方加上x
例如:x=-10011
则x的移码为100000+(-10011)=001101
例如:x=10011
则x的移码为100000+10011=110011
[/quote]
[quote]
顺便多说两句:
补码是原码求反后加一.
反码是原码直接对每位求反.
[/quote]

零距离 发表于 2006-2-21 09:17

补充点移码的定义是这样子:
[x]移=2^n+x 这里x表示真值,而2^n>x>=-2^-n
通俗点说,移码就是无论正负,在真值上加一个常数2^n

移码的名字是这样来的: 在数轴上,移码所表示的范围,恰好对应于真值在数轴上的范围向正方向移动2^n个单元。

引入移码是这样的考虑:
补码表示的好处在于去掉了负号,但人们很难从形式上判断真值大小,与人们的习惯不符;因为补码表示中符号也成了一位二进制的数,补码的表示中与真值相差一个符号位,而且可以从补码看出真值的大小,转换方便 。

移码主要用于表示浮点数的阶码,在浮点数运算中有优势,而且还有用两位符号位的移码,也就是说加上4^n,这就加上了溢出处理了。

在原码上加上一个数,成为移码。
例如,7(10) = 0111(2)(四位)
加上偏移1000成为1111
相应的3的移码为1011、2为1010、1为1001......

smalltail 发表于 2006-2-24 16:48

移 补形式相同,只有符号位相反

suyg_2000 发表于 2006-9-9 00:45

例子应该有错例如,7(10) = [u]0111(2)(四位)[/u]  (应该写成111)
加上偏移1000成为1111
相应的3的移码为1011、2为1010、1为1001......

我觉得上面这个例子有点问题:
二进制的7可以用 111 表示 也可以用 0111 表示 也可应 用 0000111 表示 但是按照定义求解的话 就会 有不同的答案了  
        如果是三位 那么  2的三次方+111 =1111
        如果是四位 那么  2的四次方+0111 =10111
        如果是七位 那么  2的七次方+0000111 =10000111

我是这样认为的

 

原码,反码,补码和移码的相关概念

一:对于正数,原码和反码,补码都是一样的,都是正数本身。
  对于负数,原码是符号位为1,数值部分取X绝对值的二进制。
                            反码是符号位为1,其它位是原码取反。
       补码是符号位为1,其它位是原码取反,未位加1。
       也就是说,负数的补码是其反码未位加1。
        移码就是将符号位取反的补码

二:在计算机中,实际上只有加法运算,减法运算也要转换为加法运算,
  乘法转换为加法运算,除法转换为减法运算。

三:在计算机中,对任意一个带有符号的二进制,都是按其补码的形式进行运算和存储的。
        之所以是以补码方式进行处理,而不按原码和反码方式进行处理,是因为在对带有符号位的
  原码和反码进行运算时,计算机处理起来有问题。(具体原因见理解原码,反码与补码)
      而按补码方式,
  一方面使符号位能与有效值部分一起参加运算,从而简化运算规则.
  另一方面使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计 
       

四:补码加、减运算公式
  
  1):补码加法公式
   [X+Y]补 = [X]补 + [Y]补

        2):补码减法公式
            [X-Y]补 =  [X]补-[Y]补 = [X]补 + [-Y]补
           其中:[-Y]补称为负补,求负补的办法是:对补码的每一位(包括符合位)求反,且未位加1.

五:由补码求原码
 
  已知一个数的补码,求原码的操作分两种情况:
   如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
   如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1;其余各位取反,然后再整个数加1。

 

 

(转)理解原码,反码和补码

相信大家看到这个标题都不屑一顾,因为在任何一本计算机基础知识书的第一章都有他们的解释,但是在书上我们只能找到一些简单的定义,没次看过之后不久就忘了。最近论坛里有人问起这些概念,看到很多人的回复是以前看过现在忘了去看看某某书之类,很少有给出一个合理的解释。于是本人就开始思考(虽然上帝会发笑,我还是要思考。),于是得出了以下的结论。
数值在计算机中表示形式为机器数,计算机只能识别0和1,使用的是二进制,而在日常生活中人们使用的是十进制,正如亚里士多德早就指出的那样,今天十进制的广泛采用,只不过我们绝大多数人生来具有10个手指头这个解剖学事实的结果.尽管在历史上手指计数(5,10进制)的实践要比二或三进制计数出现的晚.(摘自<<数学发展史>>有空大家可以看看哦~,很有意思的).为了能方便的与二进制转换,就使用了十六进制(2 4)和八进制(23).下面进入正题.
数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负).这就是机器数的原码了.假设机器能处理的位数为8.即字长为1byte,原码能表示数值的范围为

(-127~-0 +0~127)共256个.

  有了数值的表示方法就可以对数进行算术运算.但是很快就发现用带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题,如下: 假设字长为8bits

( 1 ) 10-  ( 1 )10 =  ( 1 )10 + ( -1 )10 =  ( 0 )10

(00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确.

  因为在两个整数的加法运算中是没有问题的,于是就发现问题出现在带符号位的负数身上,对除符号位外的其余各位逐位取反就产生了反码.反码的取值空间和原码相同且一一对应. 下面是反码的减法运算:

 ( 1 )10 -  ( 1 ) 10=  ( 1 ) 10+ ( -1 ) 10=  ( 0 )10

 (00000001) 反+ (11111110)反 =  (11111111)反 =  ( -0 )  有问题.

( 1 )10 -  ( 2)10 =  ( 1 )10 + ( -2 )10 =  ( -1 )10

(00000001) 反+ (11111101)反 =  (11111110)反 =  ( -1 ) 正确

问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的.(印度人首先将零作为标记并放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大).

于是就引入了补码概念. 负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的.在补码中用(-128)代替了(-0),所以补码的表示范围为:

(-128~0~127)共256个.

注意:(-128)没有相对应的原码和反码, (-128) = (10000000)  补码的加减运算如下:

( 1 ) 10-  ( 1 ) 10=  ( 1 )10 + ( -1 )10 =  ( 0 )10

(00000001)补 + (11111111)补 =  (00000000)补 = ( 0 ) 正确

( 1 ) 10-  ( 2) 10=  ( 1 )10 + ( -2 )10 =  ( -1 )10

(00000001) 补+ (11111110) 补=  (11111111)补 = ( -1 )  正确

   所以补码的设计目的是:

     ⑴使符号位能与有效值部分一起参加运算,从而简化运算规则.

⑵使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计

  所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。看了上面这些大家应该对原码、反码、补码有了新的认识了吧!

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值