首页 > 编程知识 正文

怎么算补码,二进制补码的运算

时间:2023-05-04 01:49:52 阅读:144173 作者:2005

二进制负数在计算机中用补数方式表示。 很多人很好奇为什么要用补码。 直接使用原始代码有多好? 看起来更直观,更容易计算。 但事实表明,这种直觉只是我们人类的希望。 从计算机来看,我最想要的是互补代码。 那么,为什么计算机使用补码更好呢? 另外,如何以补数计算数值呢?

我读过网上很多解释补码的文章,基本一致的回答是符号位数不变。 其他各位按位数反过来要求再追加一个。 我想在这里说的是,这些不是根本的原理。 每个人都知道这样求。 电子计算器第一章明确地写着如何寻求。 关键是为什么这样计算,其原理是什么?

1 .什么是补数

这找不到官方定义,只进行个人定义。 个人定义:补码用于在计算机上表示负数,是允许负数使用加法器参与加法运算的代码。 加减运算是计算机中最常用的运算,加法利用加法器实现,减法规则利用减法器实现。 怎么把减法变成加法? 这样,系统就只能实现加法。 答案是补数。 理解补数的最简单的例子是时钟。 例1 )如果时钟现在显示10点,那怎么定6点呢? 解:有两种方法。 一个是向后转8小时,另一个是向前转4小时。 在本例中,8和4互为补数。 也就是说,4的补数是8。 8的补数是4,但这个表的模式是12。 也许有人认为向后拨8小时也要到6点了,但他实际上比原来的日期多了12个小时。 是的,确实是,但是你的表保存了这额外的12个小时吗? 没有答案。 所以,在你调整之后,你没有记录这12个小时。 换句话说,你自动放弃了这个充满的12个小时。 两个人来看闹钟的时间时,他看到的时间是准确的。 /一的数值是11,他的型号是16,那么他的补数是多少? 解: 16-11=5,即补码为5。 2 .模具

找不到关于震级的固定定义。 简而言之,震级是一个周期的周期。 在示例1中,时钟的一个周期为12,因此模为12。 一周的模具是7天,一天的模具是24小时。 类型是补数的重要概念。

3 .使用补数运算

例3

震级为32级,将该公式16-13、13-16以补数进行运算。

解16-13=(16 ) 32-13 ) ) % 32=35 % 32=3

13-16=(13 ) 32-16 ) ) % 32=29 % 32=29 4.基于补码的二进制运算

看过电子基础的人应该记得。 第一章介绍了二进制补数是如何运算的。 正数的补数是自己,负数的补数保持符号位,剩下的请按位反加1。 使用此定义,通过示例求出数值,然后详细说明示例。 为什么可以使用负数的补数进行运算? 例4为了将通过二进制数求出15-11的值的减法运算改变为加法运算,变换数学式,将15(-11 ) 15设为正数,将编码位设为0,用二进制数表示时,将01111 -11设为负数,将编码位设为1,将负数的原码设为11011,将互补编码位设为

这是一个最简单的补数算法运算的例子,但有很多令人费解的地方。

1 .为什么每负数(-11 )位求逆再1就能表示原来的数?

2 .为什么要丢掉第一名

3 .为什么符号位可以参与运算

我们先来看看问题1。 -11不考虑符号,观察11的二进制表示。 11使用二进制表示法时为1011,将1011逐位反求得到0100。 因为求反一位,所以1011 0100=1111,但是1111 1=10000,你知道了什么? 10000是四位二进制模式。 为什么10000是四位二进制的类型呢? 原理也很简单,4位寄存器最高能代表什么? 即,(二进制) 1=16=(十进制) 15,15;1=16=(二进制) 10000,低位4位寄存器清除0,所以类型为16。

因此,无论是多少位二进制数,如果将相反得到的值加到原始代码中,正好所有位都是1的二进制数,再加起来正好进位得到模式。 所以,取反加总可以取补数。 例如(元) 101 )补) (反) 010 )1)=8,(元) 10 )补) )反) 01 )=4。

因此,负号的位数不变,对每个剩下的位求逆1,是计算补数的最简单方法,不是理论基础。

如上所述,用补码代替原始代码,计算后脱模溢出得到数值,即可得到计算值。

让我们来看看问题2。 为什么高位会被舍弃呢? 这个问题实际上在例子1中说明了。 因为你没有容纳这个高位的空间。 用最简单的说明来说明,4位寄存器只能存储数据的后4位。 第一位的进位数字无处不在。 像例1中多余出来的12小时那样,如果没有存储的地方,就扔掉。 反正结果正确就好了。 有人可能会问,说扔就扔,丢了怎么保证正确?

再看一次例子4,考虑符号位,将符号位添加到运算中。

15-11=15(-11 )其中,-11是11011(1 (因为附加了1比特的编码比特,所以模式是16 * 2^1),他的补码是10101=21

所以15 -11变为1521=36(01110101 ),原本是减少1个的数,但变换后变成了比减数大的增加数。 能不要溢出来吗? 所以对溢出位36 % 32=4进行脱模。 仔细观察被模量36=1 00100的话,到第2位为止的地方

有高位都是32的倍数,所以用32进行模运算就会全部清0,这就是为什么高位可以直接舍弃的原因,因为高位永远会是模的倍数,在模的过程中会被清0。

最后看问题3,为什么符号位能够参与运算,可能在这前面一直被符号位困扰,为什么参与运算就没有问题,看了这里的解释,我相信你将不会再被困扰。

符号位对于我对二进制补码的理解产生了很大的阻碍,我不明白为什么符号位可以参与运算,而且算出来还是对的。花了不少时间理解了符号位的含义。

首先放弃符号位就是计算机表示专门定义出来表示正数和负数用的这个思维,换成这样一种理解思路:我们观察计算机中一个二进制数,它没有专门的符号位,但是正数和负数在计算机中存储第一位二进制数会存在差异,如果它的第一位是0,那么他就是正数原码,如果它的第一位是1,那么他就是负数补码,我们通过观察第一位是0还是1即可知道这个数是正数还是负数。

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