首页 > 编程知识 正文

二进制的反码和补码,二进制的原码和补码

时间:2023-05-05 10:29:42 阅读:39585 作者:4250

学习目标1、谈谈什么是二进制,你的理解

2、原码是什么,补码和反码

二进制:0和1组成的数字系列,逢二进一。对于计算机而言,只认识0和1,数据在计算机的存储都是以二进制的形式存储。

原码,反码,补码,都是计算机用二进制来表示数据的,计算机表示数据是由数据长度和符号位表示的,首位表示符号位,0表示正数,1表示负数,剩下的数据表示所要表示的数据。

什么是数据长度?

就是我们说的位数。 例如,byte类型的数据长度为8,编码位排在第一位,数字位排在第七位。

源代码(true form )是计算机中数字的二进制点表示方法。 原编码表示法是在数值之前追加了编码比特(即最高位比特为编码比特),正数表示其比特为0,负数表示其比特为1 ) 0有0和-0两种表示,剩下的比特表示数值的大小。

原代码的优点简单直观,例如用8位二进制表示一个数。 11的源代码为00001011,-11的源代码为10001011

源代码的缺点正负相加是错误的。 范例

1(-1 )=-2

0001 1001=1010

反转的开头表示编码位,0表示正数,表示负数时,所有数据长度根据正数的显示,按每个位进行反转。

补数补数是为了补充原码和反码相对于整个0数字的二义性而出现的。 我们用8位表示数据。

源代码:

0

0000 0000

-0

1000 0000

反码:

0

0000 0000

-0

1111 1111

从上面开始,相对于0,原码和反码都出现了两种表示,可以看到违反数据唯一性的基本条件。 所以,对于0,需要只能表达为0000,0000的表示方法。 解决0这个唯一性问题,可以对正数和负数唯一表示。

我们取2(-2 )=0。 推理

2用0000 0010表示,-2怎么表示呢? 除了第一名是第一,你会发现其他我们什么都不知道。

现在1111 1110可以表示-2,但有问题。

可以看出,上述加法运算为9位的数据长度。 10000,0000。 如上所述,数据显示规定了数据长度。 超过的这个最高位1会被扔掉。 所以我们上面的表示没有任何问题。

解决了这个唯一性问题后,计算机就可以用互补代码的形式存储数据。 事实上计算机也以互补代码的形式存储数据。

例如,看看十进制-5到5的规律。 数据长度为8位

十进制

原始代码

反码

补全码

-5

1000 0101

1111 1010

1111 1011

-4

1000 0100

1111 1011

1111 1100

-3

1000 0011

1

111 1100

1111 1101

-2

1000 0010

1111 1101

1111 1110

-1

1000 0001

1111 1110

1111 1111

+0

-0

0000 0000

1000 0000

0000 0000

1111 1111

0000 0000

1

0000 0001

0000 0001

0000 0001

2

0000 0010

0000 0010

0000 0010

3

0000 0011

0000 0011

0000 0011

4

0000 0100

0000 0100

0000 0100

5

0000 0101

0000 0101

0000 0101

总结

从上我们可以看出,

原码,反码,补码正数表示都相同。

原码,反码对于数字0有两种表示,补码只有一种,

对于负数,原码,补码,反码表示不同,补码=反码+1。

延伸

对于计算机二进制表示数据,是不连续的,即二进制表示不了所有的正数,负数,例如对于无理数,无线循环小数是不能用二进制精确表示的,1/3,用二进制就没法表示,0.1用二进制也没法表示,√2用二进制也无法表示。所以也就有了计算精度这一概念。

byte a = ( byte)130值为何是-126?

计算机是以二进制补码来存储数据,但是展现在控制台是给人看的,给人看就需要符合人的理解思维方式,最符合人的理解思维方式就是原码。

我们以32位计算机系统为例,130的补码:

‭00000000 00000000 00000000 10000010‬‬

强转后: 保留8位

补码: 1000 0010 ,表示负数,对应反码需要-1

反码: 100000001,表示负数,对应原码除了符号位全部取反,

原码: 11111110

这个原码对应真值十进制数就是-126。

自我拓展 为什么会有0.1+0.2不等于0.3的问题?

出现这个情况的根本原因是因为计算机是二进制文件处理数据,我们知道数学数据类型有有理数、无理数、虚数。计算机只能处理二进制。所以对于无理数、分数、有限循环小数计算机是没办法进行二进制表示的。即使是有理数,计算机也很难用二进制全部表示。例如有理数,小数0.1。

十进制小数转成二进制小数的原理:

十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。

然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。

按照上述规则:对0.1进行二进制表示0.0001100110011...。0011会无限循环下去。你看计算机存储数据弱爆了。连个0.1都表达不了。这样就导致其进行数据计算时,存在精度丢失的情况。也就是我们常见的0.1+0.2

0.3。

十进制整数转换成二进制

十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。即运算结果逆序排序

10.1 的二进制表示

整数部分按照整数部分二进制表示,小数部分按照小数规则表示,然后把整数部分和小数部分合并起来。

10.1的二进制表示为1010.0001100110011....。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。