天天看点

有关原码,反码,补码那些事

我学c语言时,刚遇到原码,反码,补码,那可搞的我花了不少时间才弄懂,我为了让更少人走弯路,

讲讲我的理解吧。

1.要知道原码:原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值比如:如果是8位二进制:+1原码= 0000 0001   正数的符号位是0

                -1原码= 1000 0001     负数的符号位是1

2.要知道十进制转化位二进制的方法

整数除二取余,先得到的余数从低位排起,直到商为0.小数乘二取整,也是从低位排起。

如2的原码= 0000 0010

   0.2原码=  0.001(看要求取多少位)

3.要知道为什么不能只用原码不用反码或补码呢?

​为了解决原码做减法的问题, 出现了反码如计算十进制的表达式: 1 - 1 = 0

1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [1000 0010]原= -2

显然不正确

同样为了解决1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]反+ [1111 1110]反= [1111 1111]反= [1000 0000]原= -0 ,虽然人们理解上+0和-0是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0所以出现了补码。

4.要知道它们的关系

原码---  反码  ---  补码

      //按位取反  +1

//补码--- 反码  ---  原码

     // —1    按位取反

5.要知道计算机的原理

//负数在内存中存储时,存储的是二进制的补码      
int main()
{

int b = ~a;
printf("%d\n", b);
return 0;
}

//00000000000000000000000000000000 0的二进制序列

  //11111111111111111111111111111111 ~a意思是按位取反
  //11111111111111111111111111111110

  //10000000000000000000000000000001
  //最终把它化为原码

  //—1为这个代码的输出结果      

继续阅读