今天有人向我问了一道关于计算机中原码,反码和补码的知识。在这里我只是简单的记录下他们之间的关系。
无符号数就是正数是没有原码,反码和补码之说的。只有有符号数才有此说法。
插入:只有有符号的整数才有原码、反码和补码的!其他的类型一概没有。虽然我们也可以用二进制中最小的数去对应最小的负数,最大的也相对应,但是那样不科学,下面来说说科学的方法。还是说一个字节的整数,不过这次是有符号的啦,1个字节它不管怎么样还是只能表示256个数,因为有符号所以我们就把它表示成范围:-128-127。它在计算机中是怎么储存的呢?可以这样理解,用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示27个数的绝对值,再考虑正负两种情况,27*2还是256个数。
在有符号书中,反码就是该数的绝对值原码中1和0互换位置。如下:
原码:10010001 反码:01101110,
那么补码呢就是反码+1;则上面的数补码是:01101111;
在实际中>>和<<操作就是操作计算机中的数,无符号数就是把相应的原码进行移位操作,有符号的负数就是对应补码进行移位操作啦!
下面有几个例子和答案:
System.out.println(-1>>1);
System.out.println(-1<<1);
System.out.println(-3<<2);
System.out.println(-12>>1);
System.out.println(-1>>4);
System.out.println(-5>>1);
System.out.println(-5<<1);
输出结果依次是:
-12
-6
-1
-3
-10
下面对最后一个例子进行解析:
-5的原码是10000101
反码是: 11111010
补码是: 11111011
>>变成 :11111101 右移一位之后的补码
反码是: 11111100
原码是: 10000011就是 -3
-5的原码是10000101
反码是: 11111010
补码是: 11111011
<<变成: 11110110
反码是: 11110101
原码是: 10001010就是-10啦
移位操作的简单计算方法
>>右移操作
x>>y
就是x除以2的y此方,取整数如果取得数是小数,那么就四舍五入啦。不过要是零点几那么就是-1,这个自己可以分析和计算测试。
<<左移操作
X<<y
就是x乘以2的y次方
(3)>>> : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移
无符号数只有右移操作