Java 基本類型與二進制數位的本質


1.Java中的基本類型以二進制補碼的形式表示,最高位爲符號位:
  如12,  用二進制表示爲:0000 1100

  而-125, 用二進制表示爲:1000 0011 html

另補充原碼,反碼,補碼的含義: .net

 原碼:將一個整數,轉換成二進制,就是其原碼。
               如單字節的5的原碼爲:0000 0101;-5的原碼爲1000 0101。

 反碼:正數的反碼就是其原碼;負數的反碼是將原碼中,除符號位之外,每一位取反。
               如單字節的5的反碼爲:0000 0101;-5的反碼爲1111 1010。

 補碼:正數的補碼就是其原碼;負數的反碼+1就是補碼。
               如單字節的5的補碼爲:0000 0101;-5的原碼爲1111 1011。 htm

2.整數的移位操做會默認先轉型爲4字節int或8字節的long,而後再運算.   寫一個二進制數:0xAF,默認它是int類型,若是把它賦值給一個byte:   byte = 0xAF,(二進制爲1010 1111) 它會出錯,由於byte能夠表示的數的範圍爲-128至127,而0xAF默認做爲int看待是175,顯然超出了它的範圍。   但0xAF確實是一個字節的寬度,按道理講它是能夠放進一個字節裏的。若是要把它存入一個byte,必須把它從默認的int轉爲byte:   byte b = (byte) 0xAF  // 1010 1111   這樣就至關於把int前面的三字節截斷了,此時把它看成是一個有符號的一字節的數來看,首位爲1表示是負數,並且特別注意它是補碼的表示形式,把它   還原爲原碼後能夠得出它表示的數爲-81.   總結:一串二進制數,它在計算機中存放時,它的形式雖然沒有變化,可是把它看成不一樣的類型來解讀,它表示的數據是不同的,如上所示,一串   1010 1111,把它看做是int它表示的是175,把它看做byte,它能夠表示爲-81. 3.仍是以上二進制串1010 1111,把它存放在一個byte中:   byte b = (byte) 0xAF   此時若是要把它解釋爲一個int型的數,即在它左邊擴展3個0字節,湊足4個字節,把它看成int整型來解讀,若是再把它強制類型轉換:   int a = (int) b   但此時a仍是等於-81,不是咱們所願的,這是由於第一步已經確認解讀它爲一個字節的有符號數了,值是肯定的,再轉型爲int時,它是包含在int表示範圍內的。   至關於把它賦值給a。   但若是咱們仍是想把一個字節的內容解讀爲一個int值或者一個無符號的數呢?應該怎麼作?   其實此時應該把一個字節先擴展爲int的四個字節,而後去掉它的前導符號位1:   int a = b & 0x000000FF //注意byte b在邏輯運算以前會默認轉型爲int:0xffffffaf (-81的補碼),類型提高時符號位的1會一直擴展到最高位,   而邏輯與會去掉符號位和前導的一串1, 此時a就是一個無符號數了,值爲175. 參考: http://download.csdn.net/download/aggrision/2372349 http://blog.163.com/zhuowh2006@126/blog/static/10182372420127189208459/ http://www.cnblogs.com/dolphin0520/archive/2012/10/09/2711768.html
相關文章
相關標籤/搜索