Java之&0xff用法解析以及原碼、反碼、補碼相關知識


char強轉至int為什么使用0xff?

備注:在Java中 采用補碼形式表示 二進制
如果不希望進行符號擴展,可以采用與操作。例如char c;int i = c & 0xffff;其中,char有8位,int類型有32位,采用32/8=4個f(即0xffff)做與操作,即可屏蔽符號擴展。
//負整數時,前面輸入了多余的 FF ,沒有去掉前面多余的 FF,按並雙字節形式輸出
System.out.println(Integer.toHexString(-2).toUpperCase());//FFFFFFFE
//實質上0xFF會像轉換成0x000000FF后再進行位運算
System.out.println(Integer.toHexString(-2 & 0xFF).toUpperCase());//FE
System.out.println(Integer.toHexString(-2 & 0x000000FF).toUpperCase());//FE

//二進制表示形式
System.out.println(Integer.toBinaryString(-2).toUpperCase());//11111111111111111111111111111110,對應-2補碼形式經過符號擴展后的表現形式
System.out.println(Integer.toBinaryString(-2 & 0xFF).toUpperCase());//11111110,這是-2的補碼形式

符號擴展

用於在數值類型轉換時擴展二進制位的長度,以保證轉換后的數值和原數值的符號(正或負)和大小相同,一般用於較窄的類型(如byte)向較寬的類型(如int)轉換。擴展二進制位長度指的是,在原數值的二進制位左邊補齊若干個符號位(0表示正,1表示負)。

Java的數值類型轉換規則一< Java解惑>總結
1.如果最初的數值類型是有符號的,那么就執行符號擴展;如果是char類型,那么不管它要被轉換成什么類型,都執行零擴展。
2.如果目標類型的長度小於源類型的長度,則直接截取目標類型的長度。例如將int型轉換成byte型,直接截取int型的右邊8位。 

解析"多重轉型"問題

對於
   
   
   
           
  1. (int)(char)(byte)-1
Step1: int(32位) -> byte(8位)  
  -1是int型的字面量,其在Java中的補碼表現形式為[111...1],即32位全部置1。轉換成byte類型時,直接截取最后8位得補碼[1111 1111],所以byte對應的十進制數是-1。  
Step2:byte(8位) -> char(16位)  
  由於byte是有符號類型,所以在轉換成char型(16位)時需要進行符號擴展,結果為 補碼 [1111 1111 1111 1111]。由於char是無符號類型,所以其對應的十進制數是2^16-1=65535。  
3. char(16位) -> int(32位)  
  由於char是無符號類型,轉換成int型時進行零擴展,結果為補碼[0000 0000 0000 0000 1111 1111 1111 1111],其對應的十進制數是65535。 

基本概念

正數(定點小數、定點整數):  
    原碼,補碼,反碼相同;
 
負數(定點小數、定點整數):  
     反碼:保持原碼符號位不變,數值位取反  
     補碼:第一種方法給反碼的最低位+1就可以啦,若數值最高位有進位則丟棄(不向符號位進位)  
               第二種方法以原碼為基礎,符號位不變,其他從最低位開始,直到遇到第一個1之前什么都不變 ,該位之前位依次按位取反,即( 推薦  
                         原碼: ([符號位][***][1][n*0]),其對應補碼僅需對[***]部分依次取反即可。
 
例如,當編碼總位數為8時有:  
+127的原碼、反碼、補碼都為:0 1111111  
-127的原碼、反碼、補碼依次為:1 1111111、1 0000000、1 0000001  
 


擴展學習

已知負數的補碼,如何獲取其十進制數?

1.先對各位取反,包括符號位
2.轉換為十進制數
3.添加負號並減1
例如:對於11111010,取反得00000101,對應十進制數為5,由第三步轉換可得到結果:-6

 

為何n位二進制數據的表示范圍是[-2^(n-1),2^(n-1)-1]?

以8位二進制為例,-128=(-1)+(-127)=([1000 0001]+[1111 1111])原=([1111 1111]+[1000 0001])補=([1000 0000])補,所以在補碼運算結果中, ([1000 0000])補就表示-128,這就是多出來的一位數據。
 








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM