黑马程序员技术交流社区
标题:
今天又把反码补码概念想了一遍
[打印本页]
作者:
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