黑马程序员技术交流社区

标题: 今天又把反码补码概念想了一遍 [打印本页]

作者: yapo    时间: 2015-4-27 22:37
标题: 今天又把反码补码概念想了一遍
之前上课不理解为什么要分补码和反码,后来仔细想想,应该是这样的
计算机是用二进制来存储和运算数据,但是数值有正负之分,所以人会参照数学课本上十进制的标记方法,
数字前面用“+”—“符号来区分正负,同理:二进制中也设立符号位,最高位1表示负,最高位为0则表示正。例如:
      十进制中:   +           6         对应负数      -           6
          二进制      0       000 0110  对应负数    1       000 0110
                     符号位    数值位                     符号位    数值位

         上述方式人能够比较直观辨别出正负数及其数值,但是如果计算机底层也用这种方法存储运算正负数,运算起来很不方便。
         我们是这样定义正负数的:正数 + 对应负数= 0,用以上方式表示负数,计算机不可以直接进行正负数运算,需要
         设计一套电路来转换负数数值,这样电路就变得更复杂。
         根据计算机运算规则:要想使两个二进制数相加等于0,即结果中所有位都变成0.我们发现(计算机中没有减法),
           二进制正数  + 二进制正数所有位取反 = 所有位为1的二进制数
例如: 0000 0110   +     11111001         =    1111 1111
         所有位取反后 +     00000001         =  1 0000 0000 (高位溢出,舍弃)
            1111 1111   +    00000001         =  1 0000 0000  原来所有位都变成0,并且进位多出一位1,按照计算机运算规则
将会溢出舍弃。最后结果就是  0000 0000
所以:负数用“ 对应的正数所有位取反 再加 1” (补码)来表示的话,计算机就可以很方便快速得进行正负数运算了
这样产生了原码,反码、补码的概念。
正数没有反码,补码之分,就是它本身。反码和补码可以看做是为标记负数准备的。所有计算机中二进制数都是以 反码 的形式进行
存储和运算的。
用补码存储二进制数据,计算机可以快速方便进行正负数运算,但是对于负数:人只能通过符号位判别其是否是负数,却不能直观看出其数值大小
所以需要将负数转换成反码,再转换成原码。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2