原码就是十进制直接转换成二进制得到的数值,比如35的原码就是32+3,也就是0010 0011
反码和补码都是相对原码来说的,反码就是将原码全都反过来,0变1,1变0,比如0010 0011的反码是1101 1100
补码的计算方法是将反码加1,实际计算机里的数据都是以补码的形式存储的,为什么?还有,为什么补码的计算方法是这样的?
补码在计算机存储的规则是,正数的补码是它本身,负数的补码是原码的反码+1,补码的最高位是符号位,0为正,1为负数,有个例外,比如1000 0000,代表的是-128,不是代表0
为什么要以补码的形式存储?
如果以原码的方式存储,只能进行加法,不能进行减法,因为硬件只有累加器,没有累减器,同时有累加器和累减器的话,cpu的操作就多了一步,变得复杂,原本只需要累加器,现在需要两倍的硬件成本,划不来,是否有一种表示方法,可以用相加的方式表示负数呢?这样无论加法还是减法,都可以视作是加法,11-4可以看作11+(-4),1011加1100,0111刚好就是7
为什么是补码?
这就是巧妙的地方,关键在于固定位数的数据是有限的,多的位数会溢出,比如1111加上0011,本来是变成 0001 0001,因为只有四位,变成了0001,循环回来变成更小的数了,假如有n位,那么总数,也可以称为模,就是2的n次方,无论是加上模,还是减去模,都是等于一个数本身,因为循环嘛,举个例子吧,1100 +(1111+0001),后面两个合在一起就是模,这样看好看点,最后还是1100,你可以算一算,记得只有四位,满了就溢出,就被丢弃了。再看,原码+反码+1就是等于模,不信你看再上两行我举的例子,因为原码+反码刚好全部位数上的数字都为1,1100和0011,加一起就是1111,再加1,就是模。
我们要解决的问题是如何表示负数,也就是加上一个数等于减去另一个数,拿时钟举例子,目标是3点,当前指向1点,加上2或者减去10都可以,两者的绝对值刚好就是模,也就是原码和补码,所以,用原码和补码的计算方式是一样的,就比如1100-0011,等于1100+1101,都是等于1001,也就是9