前言:
我相信有很多人(包括博主自己)刚开始学习计算机,接触到原码、反码、补码的时候,都是死记硬背,忘的很快,然后去网上搜教程学习原码、补码、反码,很多也只是教我们如何去计算,并没有教我们为什么要这样算,但是博主的这篇文章会讲述我们为何要那样计算(为啦方便本篇以八位比特位也就是一个字节为标准讲述),我希望我写的这篇博客能够帮助大家更好的理解它,不用再去死记硬背啦~
那么接下来就让我们来理解原码、反码、补码,为什么有这么多码,大家一定要耐心看完喔~
一、原码
原码:十进制数据的二进制表现形式,最左边的一位是符号位,1代表负数,0代表正数。
取值范围:-(27-1)----27-1 (即-127----127)
快速理解:
相信看到我博客的柚柚们,都知道在计算机底层都是以二进制来储存数据的,为了区分正数和负数,就有啦一位符号位的出现(为什么是一位不是两位或者更多呢,是因为没有必要,一位就可以区分正负数啦~,这样不会浪费比特位,可以表示的数据范围更大)。
弊端:负数不能计算
相信细心的柚柚们会发现原码表示0好像有两种方式耶,分别是:
第一种:+0 0000 0000
第二种:-0 1000 0000
疑问:有俩个0有什么影响嘛?有
举例:如果我们计算-3+2,正确答案应该是-1,但是我们用原码去计算,答案确是-5,我们可以发现负数在加正数的时候会往反方向计算,本来正确的过程应该是-3、-2、-1,现在变成了-3、-4、-5,那我们想让他走上正确的方向且能够跟正数区分,就有啦反码。
-3 1000 0011
+2 0000 0010
-5 1000 0101
二、反码
反码:为了解决原码不能计算负数而出现的。
计算规则
正数:因为反码是为负数所设计的所以正数的反码等于原码。
负数:符号位不变(为了跟正数区分),其它位取反,0变1,1变0。例如:-1的反码为1111 1110。
弊端:若跨0计算则会出错
这样看是很抽象的,我给柚柚们举个例子:
-3+5是要等于2的,但是用补码计算结果为1,因为0计算了两次(如图所示),所以我们应该把所有的负数加一,就出现啦补码,此时-0为(1)0000 0000,+0为0000 0000,就很好地解决了0可能计算两次的问题。
-3 1111 1100
+5 0000 0101
+1(1)0000 0001
三、补码
补码:为了解决负数计算时跨0的情况。
取值范围:-27—27-1(即**-128**----127)
疑问:为什么补码的最小值为-128呢?
-127:
补码:1000 0000
反码:1000 0001
通过观察我们可以发现-127的补码还能减一,减为1000 0000即为-128,这就是为什么补码的最小值为-128。
【拓展】:分数怎么转化为为二进制?不会要先除成小数再算叭,其实不用。
我们只需要把分母转化为二的几次方,把分子转化为二进制,然后让分子的小数点左移分母有几次方就移动几位。
例如:
5/16 5是0101,16是24,所以分子的小数点左移4位,则5/16的二进制为0.0101。
总结:
总的来说其实理解原码、反码、补码不难,柚柚们可以自己多去试几个数据,理解他,就会发现它们很简单,以后还会有这种偏向基础的博客,给萌新们参考,有兴趣的柚柚们请给博主三连喔。