计算机中原码,反码和补码和移位操作

来源:互联网 发布:网络维护的工作内容 编辑:程序博客网 时间:2024/05/01 19:42

今天有人向我问了一道关于计算机中原码,反码和补码的知识。在这里我只是简单的记录下他们之间的关系。

无符号数就是正数是没有原码,反码和补码之说的。只有有符号数才有此说法。

插入:只有有符号的整数才有原码、反码和补码的!其他的类型一概没有。虽然我们也可以用二进制中最小的数去对应最小的负数,最大的也相对应,但是那样不科学,下面来说说科学的方法。还是说一个字节的整数,不过这次是有符号的啦,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,也就是算术右移
   无符号数只有右移操作


0 0
原创粉丝点击