原码,反码,补码的关系
1:为什么会出现原码,反码,补码?
首先,确定一点,计算机中的储存信息的方式是以二进制的形式进行存储的。
而原码指的是对数字二进值的定点表示方法,之所以采取二进制来保存数据的原因是二极管只能表示两种状态,通或者不通,即0和1。
在进行数字运算的时候,只要将10进制的数据转为2进制,就可以快捷的完成运算。只不过这种运算方式在涉及到负数运算时就会出现问题,举个例子。
10进制运算:
-1 + 2 = 1;
二进制运算
1001
+
0010
|
1011
1011在转化为十进制为-3(最高位是1时表示负数)
这样的结果明显不符合我们的认知,那么错在什么地方呢?
原因在于我们使用二进制进行有符号运算时,会将最高位设置为符号位,来区分正数和负数,即将一个数据分为了符号部分和数值部分,举个例子
1011(-3)
最高位的1是符号位,后三位是表示数值的数值位,分别设为a和b,合起来为a*b;
我们在进行加减运算时,符号位是不参加运算的,只进行数值位的运算,比如
1011
+
0001
=
1100
-3+1=4,这明显是错误的。原因就在于没有考虑到符号的影响,我们所有的计算都
在数值位上进行:
```cpp
设符号位是a,设数值位的值为b,十进制的值就是ab
现在加上一个数,a*(b+2)=ab+2a;当a是1时,表达式的值为b+2,当a是-1时,表达式
的值为-b-2,a的值影响到了整体的计算结果。
1.1:引入反码,抵消符号位带来的影响
从上面的计算已经知道,利用原码进行计算,会在正数和负数同时出现的运算上出现问题,本质的原因在于一个正数和一个负数进行运算时,符号位永远是1,导致原本做的加法变成了减法。在数学关系上,我们都知道负负得正,如果引入另外一个值,使得通过这个值既能反推出原码的值,又能用来做正确的数值计算,那么二进制运算的问题将得到完美解决。于是,反码应运而生。
要想做到负负得正,