原码、反码、补码超级无敌清楚的讲解

ぐ巨炮叔叔 提交于 2020-02-07 02:46:22

计算机中的数据可以分为:数值数据、非数值数据;
数值数据可以分为:有符号数据、无符号数据;
非数值数据包含:文字、视频、图像…

以8位(一个字节)的数据为例:
有符号数据的表示范围为:-(2的n-1次方)-1到2的n-1次方;
无符号数据的表示范围为0到2的n-1次方

无符号数据与原码、反码、补码的关系:
无符号数全是正数,原码就是该正整数的二进制表示方法;
无符号整数的原码=反码=补码;

有符号数与原码、反码、补码的关系
(正整数的原码=反码=补码)
原码:

有符号数据中的正整数的原码就是该数的二进制数,如:2用八位二进制
表示为00000010

有符号数据中的负整数的原码就是正整数的原码的最高位(符号位)为1,
其他位不变,如-2的原码用八位来表示为10000010

反码:

有符号负整数的反码就是在原码的基础上,符号位(最高位)不变,保
持为1,其余位按位取反(也就是原来为1的位变成0,原来位0的位变为1),
-2的反码就是11111101

补码:

有符号数的补码就是在原码的基础上,符号位不变,其余位按位取反,
最后在最低位加一,-2的补码就是11111110

为什么会有原码、反码、补码呢?
计算机中的数都是用补码的形式存储的;

也就是正数在计算机中的存储方式就是补码(正数的原码=反码=补码);

负数在计算机中的存储方式也是补码(负数的原码、反码、补码规则在上面);

私以为原码、反码毫无卵用,有用的只是补码,因为负数的二进制并不那么记,也不好推算,所以制定了原码、反码的概念,方便从正数的二进制数推算除负数在计算机中的二进制数,为什么这样说呢?下面我以一张图解释。

这张图依然以八位二进制来解释
在这里插入图片描述
右边那一半就是正数的二进制表示,也是其原码、反码、补码;

左边那一半就是负数的补码形式,有没有发现左边的数就是右边的数按位取反;-1的补码就是0的二进制取反,-128的补码就是127的二进制取反;

而且127的二进制+1就是-127的补码,很神奇对不对,好像经历了一个轮回。计算机中只有一个加法运算器,没有减法运算器,也没有乘除法运算器。

计算机中是如何实现加减法的?
因为计算机中的加减法都是正负数的补码相加,也就是计算机中根本不存在减法,本质上只有加法,乘除法也是根据加法操作特殊处理来的,至于怎么来的,我还没去搞清楚,嘻嘻嘻;

现在有没有明白为什么我说我觉得原码、补码毫无卵用;精华都在那张图上面,没看懂多看几遍;

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!