您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

关于原码、反码和补码的个人总结

最近复习了一下计算机组成原理,关于原码、反码和补码有了全新的认识。

众所周知,计算机内的数据都是以二进制机器数的形式表示,原码、反码、补码的出现,是为了计算机硬件能更加方便直接地使用数据,是否有利于运算器设计的优化以及简化。

机器数对应的实际数值称为真值,符号用"+","-"表示.

机器数有有符号和无符号之分,

有符号的机器数,用二进制的最高位表示真值的符号,"0"表示正数,"1"表示负数.

对于无符号而言, 无符号数均是正数, 在机器数中没有符号位。若约定小数点的位置在最低位之后, 则表示纯整数; 若小数点的位置在最高位之后, 则表示纯小数.

为了机器运算, 带符号的机器数可以用原码, 反码 ,补码, 移码等不同的码制.

由于原码和反码不利于做减法, 即不同符号位的数值相加, 因此诞生了补码(至于为何原码和反码不利于机器做减法, 请体会举例2). 在带符号数的运算中, 可以这样说, 原码和反码都是为了转换成补码的中间数.

原码即将真值写成二进制的形式,最高位为符号位. 有+0和-0之分.

反码即将符号位为1的原码, 除符号位外, 按位取反. 正数不变. 有+0和-0之分.

补码即将符号位为1的反码末位加1,正数不变. 无+0和-0之分, 0的补码即为[+0]的原码. 可表示的数比原码和反码多一个.

举例1:

若机器的字长为4, 真值1,-1,7,-7, 4,-4的原码,反码和补码表示如下:

 

1

-1

7

-7

4

-4

原码

0 001

1 001

0 111

1 111

0 100

1 100

反码

0 001

1 110

0 111

1 000

0 100

1 011

补码

0 001

1 111

0 111

1 001

0 100

1 100

特别留意,当补码为1 000时, 此时表示的真值为-8.

 

举例2:

若机器字长为4, 式子3-5的原码\反码\补码,以及5-2的反码\补码的计算:

 

3

-5

-2

原码

0 011

1 101

1 010

反码

0 011

1 010

1 101

补码

0 011

1 011

1 110

  • 原码计算步骤:

符号位不参与运算,需要单独设计逻辑电路来判断是否是异号运算,同时增加一个专门计算减法的减法器.如果式子或结果涉及0, 原码0的表示不唯一, 需要人工来确定是+0还是-0, 很难实现自动化.

具体步骤:

1.读入数据,判断为异号,调用减法器,做减法运算.

2.计算011-101, 不够减, 记录结果符号位为1

3.调换顺序,计算101-011=010

4.加上符号位,获得结果 1 010

 

  • 反码计算步骤:

符号位参与运算, 只需调用加法器, 符号位的进位再加到结果的最低位, 若符号位为1,  再对结果进行取反( 以反码运算得到的结果也是反码).  如果式子或结果涉及0, 反码0的表示不唯一, 需要人工来确定是+0还是-0, 很难实现自动化.

具体步骤:

1.读入数据,将数据转化为反码

2.调用加法器,计算0 011+1 010=1 101

3.符号位为1,取反,获得结果1 010

如果计算5-2:

即 [0 101]反+[1 101]反=0011(符号位有进位), 竖式为:

     0 101

 +  1 101

   10 010         ------>存在符号位进位,将进位拿走加到剩余数字的最低位

+          1         

      0 011

 

  • 补码计算步骤:

符号位参与运算, 只需调用加法器, 若符号位为1, 将结果转化为原码( 以补码运算得到的结果也是补码). 若符号进位后溢出,直接丢弃最高位.(0唯一, 易实现自动化)

具体步骤:

1.读入数据,将数据转换为补码

2.调用加法器计算0 011+1 011=1 110

3.符号位为1, 转化为原码:1 010

 

如果计算5-2:

即 [0 101]补+[1 110]补=[0011]补 (符号位有进位), 竖式为:

    0 101

+  1 110

  10 011

丢弃溢出的最高位1得: 0011

 

 

其实原码和反码在具体算式中到底是怎样相加的并不重要, 计算机在运算时用的都是补码. 重要的是体会其中的思想.

 

而关于补码的由来应该是这样的:

我们都知道一个数加上他的相反数等于0, 比如1加上它的相反数-1为0.

还是以四位字长的机器码为例,如若0唯一即0 000 ,数1的原码为0 001 , 若要一个二进制数加上这个数等于0 000,那么这个二进制数只能为 1 111 , 0 001+1 111丢弃溢出位后就为

0 000.  仔细观察原码和反码不难发现: 任意一个正数的原码加上它相反数的反码, 得到的二进制数都是一个一串1. 这一串1只要再加一个1,就刚好溢出, 而我们要的正是它刚好溢出从而使得和为0, 于是补码就应运而生了. 1 111刚好是由-1的反码1 110加一后得到的补码.


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进