首页 > 范文大全 > 申报材料 正文
【原始编号申报】一篇文章精通计算机的原始代码、反代码、补码

时间:2023-04-18 20:36:25 阅读: 评论: 作者:佚名

表示的最大值为7,14显然已经超过了最大值,所以我们在将14转换成二进制时,一定会发生溢出,发生溢出后,我们把最高位舍弃,即得到了二进制的补码。14转换成二进制为 01110,那我们最高位的0舍弃,即1110,所以,-2的二进制补码为-6。

那么我们再来算下5+(-6)的结果

0101

1110

--------

10011

这时候我们发现发生了高位溢出,那我们再把最高位舍弃,即0011,结果为3,这时候的结果就是正确的了。

那么现在的问题来了,我们如何计算任意一个负数对于的补码呢?

首先我们说正数,因为补码主要是为了负数计算不准确的问题,但是对于正数来说,计算永远都是准确的。所以正数可以不用计算补码,直接做运算。我们也可以理解为正数的反码和补码都和原码保持一致。那么下面说的所有关于补码的运算,都是针对与负数来说。

我们先来定义几个变量:

S1 = 二进制能表示的范围的数量

S原码10 = 十进制原码

S原码10_符号 = 十进制原码符号位

S原码10_数值= 十进制原码数值位

S补码10 = 十进制补码

S补码10_符号 = 十进制补码符号位

S补码10_数值 = 十进制补码数值位

S原码2 = 二进制原码

S原码2_符号 = 二进制原码符号位

S原码2_数值= 二进制原码数值位

S补码2 = 二进制补码

S补码2_符号 = 二进制补码符号位

S补码2_数值 = 二进制补码数值位

从时钟的原理我们可以知道,S补码10=S1 -S原码10_数值。那么S1 怎么算呢?由上文我们可以知道,二进制能表示的正数的数量和能表示的负数的数量相同,我们我们只需计算能表示的正数的数量,在乘以2,就是整个二进制能表示的数的数量。那对于正数来说,能表示的最小的正数为0,能表示的最大的正数为2^(n-1)-1,所以,能表示的正数的数量 = 2^(n-1)-1 + 1 = 2^(n-1),所以S1=2^(n-1)* 2 = 2^n。所以,S补码10=S1 -S原码10_数值 = 2^n - S原码10_数值。

现在,S补码10已经计算出来了,我们在来计算S补码2,首先我们来计算一下S补码2_符号:

因为S原码10_数值的最大是为 2^(n-1)-1,所以S补码10的最小值=2^n-2^(n-1)+1=2^(n-1) + 1,它一定大于2^(n-1)-1。即S补码10,一定会大于二进制能表示的最大值,所以转换为二进制时,一定会发生溢出,并且次高位为1,溢出后,我们把最高位舍弃,这时,次高位就成了符号位,因为此时次高位为1,所以S补码2_符号一定为负数。

下面我们在来计算一下S补码2_数值:

由上文,我们知道,S补码10= 2^n - S原码10_数值,所以,S补码2_数值=2^n - S原码2_数值=2^0+2^1+2^2+......+2^n-1 + 1 - S原码2_数值 = (2^0+2^1+2^2+......+2^n-1 - S原码2_数值)+ 1 。

此时,我们可以认为2^0+2^1+2^2+......+2^n-1,相当于二进制的每一位都是1,那么它减去S原码2_数值时,就相当于对S原码2_数值的每一位都取反,即得到S原码2_数值的反码。所以,S补码2_数值 = S原码2_数值的反码 + 1。

所以,这也就证明了前面的结论:

对于负数来讲,

反码:符号位不变,数值位的每一位做按位取反

补码:对反码的值+1

  • 补码还可以解决二进制中0的问题以及int类型为什么可以表示-2^31

我们还是拿一个4位的二进制来举例:4位二进制能表示的负数的范围为:1111至1000,即-7到-0,而位二进制能表示的负数的范围为:0000至0111,就0至7,这时我们发现,出现了两个0,一个是1000,一个是0000,这显然是不行的。

通过上面我们知道,负数的反码是数值位不变,然后数值位按位取反,那么负数的反码可以表示的范围也是1000至1111,而补码是在反码的基础上+1,所以补码可以表示的范围为:1001至1111+1,就-1到-8。所以,通过补码,就完美的解决了这个问题。而int类型为什么可以表示-2^31这个问题,也同时就解释清楚了。

往期精彩:

java中的enum第一期:enum存在的意义

java中的enum第二期:enum底层实现原理

工厂模式如何消除大量的if else 第一期

Elasticsearch的核心真的是倒排索引吗?

史上将String常量池讲得最透彻的文章

作者介绍:

贠学文,具有多年经验的java开发工程师,业余时间利用头条分享技术知识点与自己对技术的感悟,帮助对自己未来感到迷茫的程序员,在技术上得到提升。结识一些志同道合的朋友,相互促进,共同进步。

  • 评论列表

发表评论: