首页 > 编程知识 正文

-78的原码反码补码(原码反码补码概念)

时间:2023-05-05 22:15:35 阅读:96347 作者:2985

我是计算机专业大一新生,萌(l)心(j),刚开始接触二进制。很多朋友都知道电脑里面的数据都是用二进制来存储和计算的,但是一个小小的二进制得是一堆华而不实的东西,一堆有原码和补码的东西让我看起来很傻。

人渣吼

但是你真的不能停止学习[哭泣]。不管生活有多艰难,你能吗?我在网上查了很多资料,终于有了头绪。

为什么要引入补码这个概念?

我们已经知道所有的数据都以二进制形式存在于计算机内部。但是,有一个问题。说正数直接表达出来是好的,但是负数呢?电脑无法保存负号,怎么办?所以人们想出了一种表示数字的模式——一种可以表示符号的二进制表示法。最高位用于表示符号,0为正,1为负。

以8位二进制数为例。二进制数51和-51如下(如果位数小于0)。

51=(00110011)

-51=(10110011)

瞬间就清楚了,但仔细想想,还是有问题。即将发生

(00000000)=0

(1000000)=-0加0减0,啊,这个.有点奇怪。虽然正0和负0都是0,但是0对应两个二进制码,这使得二进制表示的数量少了一个。仍然以8位二进制为例,根据排列组合计算有256种不同的排列,但按照这种模式,它可以代表255个数字。所以,这显然不是最优的表示模式,计算过程中可能还会出现其他问题(不知道具体会出现什么问题,毕竟我也是新手[不好意思笑])。

所以引入了补码,刚才的符号表示称为原码。

00-1010其实按照我的理解,补码和原码之间没有太大的相关性。因为,补码直接解决了初始问题:计算机不能直接存储负号,那么它如何表示负数呢?补充另一种方法,找到解决问题的另一种方法:把负数变成正数。

然而,这不是一个随机的转换。有一种固定的方式,就是十进制负数加2的n次方,其中n是要转换成二进制的位数。例如,要找到-28八位补码,将2的八次方相加,然后将总和转换为二进制。这样就避免了负数转换成二进制数的问题。正数本身通常可以转换成二进制,所以正数的补码仍然是它自己的二进制。

00-1010是个好问题(据说所有自问自答的人都是傻子[抠鼻子])。n次方加2太麻烦了,不能和原码建立联系。反码是两者之间的桥梁,不仅可以连接原码和补码,还可以更容易地将原码转换为补码。当不引入反码时,计算从原码到补码的转换,但通过反码只需要形式上的改变。

通过补码将原始代码转换成补码非常简单。符号的负二进制补码是将除最高位(符号位)之外的其余数字变成相反的数字,从1到0,从0到1。例如

(10010011)的补码是(11101100)。因为补码和补码的引入是为了解决负数的表示问题,所以正数的补码和补码本身就是负数。

得到补码后,在补码上加1得到补码。有些朋友可能会有些疑惑。为什么呢?

所以补码到底又是个啥?

的问题也困扰了我很久。我试图用数学方法证明。可以证明,但是很麻烦。我前面说过,通过反码的渠道把原代码转换成它的补码,是一种形式上的改变方法。是的,不要想得太复杂。让我们先回到它的补语的本质。

补码是十进制负数加上2的n次方,通过转换为二进制得到。有这样一个公式。

补码的n次方-2=原始码

所以有

原来的补码=2的n次方,这是我们刚才运算的基础。这个2的n次方有一个专业名称叫做module,它是以1后跟n个零的形式写的。

而反码和原码的位数正好是互补的,加在一起可以得到一系列的1(假设有n个1),那么反码加1和原码加1之后会得到n个零,就是模。而且因为“原码的补码=2的n次方”,补码加1就是补码。

举个例子(上例)

(10010011)的倒数是(11101100)

加法(11111111)(最高位是符号位,不做加法)

在反码(11111000)上加一

(10010011)和(10000000)之和为(1000000),即2的n次方。

以上大概就是前世的补语和原代码的补语。我的水平有限,文章可能会有一些错误。请在评论区指正。也欢迎大家在评论区讨论。

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