`
talentluke
  • 浏览: 611330 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

原码、反码、补码

阅读更多
  1. public static void main(String[] args) {   
  2.         // TODO Auto-generated method stub   
  3.         int i= 0xFFFFFFFA; //补码  
  4.         int j=~i;   
  5.         System.out.println(i);   
  6.         System.out.println(j);   
  7.     }   
  8. /*结果为什么是:  
  9. -6  
  10. 5  
  11. */

int i= 0xFFFFFFFA;


计算机以补码形式存储有符号整数的,要知道二进制补码对应的十进制是多少,就得知道二进制补码的原码,从原码来求十进制数

0xFFFFFFFA在计算机中的存储形式为1111 1111 1111 1111 1111 1111 1111 1010(补码形式),要知道0xFFFFFFFA的十进制,就得求原码。

从补码求原码与从原码求补码类似

(1)补码最高位为0,表示正数,补码的原码是它本身,所以它表示的十进制数就从自身转换。

(2)补码最高位为1,表示负数,先将补码各位取反加1,得到它的绝对值原码,将绝对值原码转换成十进制,然后加上负号,就得到补码表示的十进制数。

 

补码=               1111 1111 1111 1111 1111 1111 1111 1010
绝对值原码=    0000 0000 0000 0000 0000 0000 0000 0101 还要+1就等于 
                          0000 0000 0000 0000 0000 0000 0000 0110
后面0110就是6 ,加上负号得到负数补码表示的十进制数,那么结果就是-6

引用

int j=~i;


~ 符号表示取反
i=1111 1111 1111 1111 1111 1111 1111 1010 ,取反则为
j=0000 0000 0000 0000 0000 0000 0000 0101 就等于5了。

 

注意:为了方便,常把十进制数写成十六进制数(因为最大为15即F,比9大),如0xFF(或FFH),高位不够补0,表示的十进制数位15X16^0+15x16^1即255,也可以把0xFF转换成二进制然后再转换成十进制,1111 1111转换成十进制也是255,这里只是主观的从二进制直接转换,不涉及计算存储,所以不考虑补码,存储的时候是用补码,如int i=0xFF表示补码0000 0000 0000 0000 0000 0000 1111 1111;int j=0xFFFFFFFF表示补码1111 1111 1111 1111 1111 1111 1111 1111。数据以二进制存储在内存中,为了方便也常用十六进制表示,两个十六进制数就表示8bits(一个存储单元)数据,如1111 1111用FF表示就简洁易懂。

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics