原码、反码、补码(保姆级讲解)---- 2021.1.14

前言

由于这段时间一直在忙着找工作和比赛还有项目的事情,就耽误了几天。这段时间开始有精力来整理了(其实主要是被爱徒催更了。。。。),所以我计划着做一期“C语言”的专栏,为什么要做这个呢?因为众所周知,很多编程语言的底层都离不开C语言,所以万变不离其宗,我会把我认为需要注意到的并且在将来的面试中可能会遇到的知识点都会在这个专栏当中提到,当然一些最基本的语法和规则我觉得大家可以通过自己的能力来学会,所以我们一起来学习吧!!!

并且我计划在讲完C语言之后,会进阶到C++,还会进阶到深度学习等等,至于是什么以后再说,所以大家敬请期待!!!

原码

首先我们需要知道在计算机中存储信息是以二进制来储存的,也就是说数的最原始的形式是二进制码。

举个例子,例如我们想要赋值一个变量,数值为120,储存在计算机中。
(tip:储存在计算机的数是由正负区分的,一般如果是有符号数的话,则通过最高位来判断,如果最高位为0,则代表正数。如果最高位为1,则代表负数。如果是无符号数的话,全部都是数据位,也就没有判断符号的位了)

120
0111 1000(原码)
如上所示,最高位为0,则为正数

-23
1001 0111(原码)
如上所示,最高位为1,则为负数

那为什么还会有之后的反码、补码呢?接下来你就知道了。

举个例子:(原码)
-0: 1000 0000
+0:0000 0000
-1: 1000 0001
+1:0000 0001

如果按照正常情况,1+(-1)最终的结果应该等于0。我们来试试。

-1: 1000 0001
+1:0000 0001
相加结果:1000 0010 = -2 (-2不等于0,这个结果明显不正确)
所以我们可以得出一个结论,就是负数在计算机中是不能以原码形式来存储的。因为如果负数如果在计算机中以原码形式存储的话,那么有两个原因:1.负数运算结果不正确 2. 0的状态有两种:-0,+0

那么科学家为了解决这个问题,就引入了反码。

反码

那么原码是以什么样的规则来转换成反码的呢?
正数的反码不变,负数的反码(符号位不变,其他位也就是数据位取反)
还是同一个例子:
(原码)
-0: 1000 0000
+0:0000 0000
-1: 1000 0001
+1:0000 0001
(反码)
-0: 1111 1111
+0:0000 0000
-1: 1111 1110
+1:0000 0001

如果按照正常情况,1+(-1)最终的结果应该等于0。我们来试试。
-1: 1111 1110
+1:0000 0001
相加结果:1111 1111 = -0 (虽然结果是-0,说明负数的运算结果正确,但是0的状态有两种,所以这个结果还是不正确)

那么科学,众所周知是严谨的,所以科学家为了解决这个问题,就引入了补码。

补码

那么反码是以什么样的规则来转换成补码的呢?
正数的补码不变,负数的补码等于反码+1
(反码)
-0: 1111 1111
+0:0000 0000
-1: 1111 1110
+1:0000 0001
(补码)
-0: 1111 1111
0000 0001
相加结果:1 0000 0000 = 0000 0000(最终最高位相当于溢出)
-1: 1111 1110
0000 0001
相加结果:1111 1111
所以最终结果为:
(补码)
-0: 0000 0000
+0:0000 0000
-1: 1111 1111
+1:0000 0001

如果按照正常情况,1+(-1)最终的结果应该等于0。我们来试试。
-1: 1111 1111
+1:0000 0001
相加结果:1 0000 0000 = 0000 0000 = 0(最终最高位相当于溢出,最终结果等于0,运算结果正确,且0只有一种状态。所以正好解决了负数以原码形式存储的两个问题)

总结

综上所述,正数在计算机中存储是以原码形式存储的,因为正数的原码、反码、补码都一样。而负数在计算机中是以补码形式存储的。

特殊场景

有些时候我们可能得到的是补码,但是我们需要求取原码。所以再举个例子:
-23
原码:1001 0111
反码:1110 1000
补码:1110 1001

假如我们现在已经知道补码为1110 1001,则无非两个步骤,第一个是补码求反码,第二个是反码求原码。

补码求反码:符号位不变,其他位取反(数据位)
补码:1110 1001
反码:1001 0110

反码求原码:反码+1
反码:1001 0110
0000 0001
相加结果:1001 0111 (与预想结果相同)

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!

猜你喜欢

转载自blog.csdn.net/qq_40544107/article/details/112603655