如何理解二进制原码,反码,补码,二进制补码运算

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

 

以上是关于如何理解二进制原码,反码,补码,二进制补码运算的主要内容,如果未能解决你的问题,请参考以下文章

二进制 原码 反码 补码(搞定)

二进制的原码、补码、反码详解

二进制原码反码补码和位运算

java原码,反码,补码 位运算

原码反码补码有符号数和无符号数运算

原码反码补码的理解与思考