A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© H_shaohui 中级黑马   /  2016-4-19 21:32  /  631 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

计算机内部采用二进制表示数值。如十进制数10用二进制数表示为1010。设计算机字长为8,即1Byte。最高位表示符号,0为正,1为负
来看看用原码表示的数在进行加减乘除运算是会有什么问题:
  • 十进制:1-1=1+(-1)=0
  • 原码:(0000 0001)-(0000 0001)=(0000 0001)+(-0000 0001)=(0000 0001)原+(1000 0001)原=(1000 0010)原=-2,显然不正确
以上的运算说明了负数(也就是带符号数字,正数没问题)原码运算在某些时候得不到正确结果。
再来看反码表示进行加减乘数运算会有什么问题:
  • 十进制:1-1=1+(-1)=0
  • 反码:(0000 0001)-(0000 0001)=(0000 0001)+(-0000 0001)=(0000 0001)反+(1111 1110)反=(1000 0000)反=-0,出现了负0.
一般不区分+0、-0,用反码就会出现这样的问题。
最后看看补码运算:
  • 十进制:1-1=1+(-1)=0
  • 补码:(0000 0001)-(0000 0001)=(0000 0001)+(-0000 0001)=(0000 0001)补+(1111 1111)补=(0000 0000)补=0
补码具有自己独特的优点,用补码连同符号位一起运算没有出现原码、反码的问题,这就是为什么现代计算机普遍采用补码运算的原因。
计算方法:
         由于正数加减运算不存在此问题,所以正数没有反码、补码,或者说正数的原码、反码、补码都一样
          原码:负数的原码为1|x|  
          反码:负数的反码,符号位不变,数值取反
          补码:负数的反码加1(会影响符号位)
范围解疑
          这里以byte为例来解释一下取值的范围。byte占一个字节,是8位。如果是无符号类型的整数,那么原码最大值11111111,所以原码范围就是0---255(也就是0~~2^8-1),总共256个数。
          对于有符号类型的byte值,那么原码最大值应该是01111111(第一位的1代表负数符号),最小值应该是11111111,所以原码范围是(-127~-0 +0~127),总共256个数。但是在有符号原码进行加减运算时的问题(原码运算不正确,反码出现+0、-0),所以出现了补码。对于十进制:127 + 1 = -128 ,补码算法:01111111 + 00000001 = 10000000 ,这里的10000000原码就是-0,所以在计算机中1000000的补码表示的就是 -128。需要注意的是:-128是没有原码和反码的,只有补码!

总结:

1>补码的设计目的是:

        ⑴ 使符号位能与有效值部分一起参加运算,从而简化运算规则。补码机器数中的符号位,并不是强加上去的,是数据本身的自然组成部分,可以正常地参与运算。

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

2>反码是原码与补码转换的一个中间过渡,使用较少。

3>所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、c等其他高级语言中使用的都是原码。


1 个回复

倒序浏览
直接看总结就行了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马