如何理解二进制原码,反码,补码,二进制补码运算
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解二进制原码,反码,补码,二进制补码运算相关的知识,希望对你有一定的参考价值。
带符号数,有三种表示方法,即:原码、反码和补码。
但是,在计算机系统中,数值一律用【补码】来表示和存储。
所以,在计算机系统中,原码和反码,都是不存在的。
使用补码的意义:可以把减法或负数,转换为加法运算。
因此,就能简化计算机的硬件。
=====================
补码的概念,来自于:补数。
比如钟表,时针转一圈,周期是 12 小时。
那么,倒拨 3 小时,可以用正拨 9 小时代替。
9,就是-3 的补数。 计算方法: 9 = 12-3。
同理,分针倒拨 X 分,可以用正拨(60-X) 代替。
60,是分针的周期。
懂得三角函数的同学,都知道,三角函数的周期是 2π。
那么,在-π/2 和 +3π/2 处的函数值是相同的,可互换。
算法是: +3π/2 = 2π - π/2。
------------
当你使用两位十进制数:0~99,周期就是 一百。
那么,减一,就可以用 +99 代替。
24-1 = 23
24 + 99 = (1) 23
舍弃进位,这两种算法,功能就是相同的。
于是,99 就是 -1 的补数。
计算: 补数 = 周期 + 负数
对于其它负数,自己去求补数吧。
------------
计算机中使用二进制,补数,就改称为【补码】。
八位二进制是:0000 0000~1111 1111。
相当于十进制:0~255, 周期就是 256。
那么,-1,就可以用 255 = 1111 1111 代替。
所以:-1 的补码,就是 1111 1111 = 255。
同理:-2 的补码,就是 1111 1110 = 254。
继续:-3 的补码,就是 1111 1101 = 253。
。。。
最后:-128 的补码,就是 1000 0000 = 128。
负数补码的计算公式:【 256 + 这个负数 】。
(式中的 256 = 2^8,是八位二进制的周期。)
正数,并不存在补码的问题。
所以,正数,并没有补码,可以直接运算。
(也有人乱说:正数本身就是补码。)
------------
求解算式: 7-3 = 4。
计算机中,并没有减法器,必须改用补码相加。
列竖式如下:
7 的补码=0000 0111
-3的补码=1111 1101
--相加-------------
得: (1) 0000 0100 = 4 的补码
舍弃进位,只保留八位,结果完全正确。
------------
借助于补码,可以简化计算机的硬件。
原码和反码,都没有这种功能。
所以,在计算机中,根本就没有原码和反码。
它们都是什么? 就不用关心了。
参考技术A 1.基础概念和计算方法在探求为何机器要使用补码之前,
让我们先了解原码,
反码和补码的概念.对于一个数,
计算机要使用一定的编码方式进行存储.
原码,
反码,
补码是机器存储一个具体数字的编码方式.
http://blog.csdn.net/yinyhy/article/details/8732118
java 原码,反码,补码 简化总结
1、计算机为了简化,只用了加法运算器,而不用再设计一个减法运算器
2、由于上述原因,计算机采用补码计算,而我们看到的数值显示形式是原码,换句话说,原码是我们脑子可以算出来的数值,而计算机只用补码计算
3、补码是很好理解的:
2-1=1这是我们脑中产生的,我们转换二制度看看 0010-0001=0001 计算机无法计算,因为只有加法运算器
那得给计算机找出-1的二进制表示方式,我们知道,两数相加等于0,即是一个数是另一个数的负数
但是找出二进制的相加等于0的数,并不好找,我们应该换个方法找出一个数相加是1111的二进制再加上0001那就是10000,最低位即是0000,找出一个相加等于1111的,这个简单,取一个数的反数即可
这个数,我们称之为反码,再加上0001后,我们称之为补码,即推演:-1->0001->取反1110->与1相加1110+0001->补码1111,那这个1110即是反码了,1111即补码
验证下:1-1=0 即0001+1111=10000,最高位舍去即0,正确
但是上面还有一个小问题
如果计算机采用补码计算,那么1的补码是多少呢?从上面验证可以看出,1的补码即0001即已可以计算机正确计算了,所以正数的反码,补码,与0001原码相同
假如说,计算机是4位存储,那15的二进制即1111,-15反码0000,补码0001,与1补码相同了,所以,我们还得区分下,正数与负数,规定最高位1表示负数,0表示正数,不参与原码,反码,补码计算
加了一个最高位标志,计算机存储也得加一位,5位存储:
-15=1 1111->取反1 0000->补码1 0001,15的补码是0 1111两数相加1 0001+0 1111=1 0 0000,最高位舍去,等于0,说明正确
最后一个问题-0会不会有问题?
-0=1 0000->取反1 1111->补码1 0000
-16=(-15)补码1001+(-1)补码1111=补码1 0000
+0=0 0000->补码0 0000
-0与+0 其实是一个数,没必须区别对待,因为这样产生了两个补码,对计算机实在是浪费,当-0与-16的补码又恰恰相同
好像是印度阿三提出的吧,我们知道,由于最高位用来标志是正与负数,故存储空间少了一位,那这个-0就给丢失的最大负数吧
总结:java int采用32位存储,按上面推算表示范围是-2的31次方至2的31次方减1,因为,最高位用来区分正负数,所以数值存储只能用到31位,又-0补给了负数,所以负数不用减1
以上是关于如何理解二进制原码,反码,补码,二进制补码运算的主要内容,如果未能解决你的问题,请参考以下文章