關於java關於邏輯運算子和移位運算子的深入問題
首先我是因為這幾個程式碼,產生結果引入的深思!
結果是:
問題就來了:
1、首先>>和<<操作很簡單,邏輯<<低位補0就行,而>>補符號位
2、就是典型的(int) 轉(byte)型別了,這裡舉上面圖片程式碼的例子
System.out.println(0Xa2); //162
System.out.println((byte)0xa2); //-94
這是為什麼呢?,答案是int是4個位元組也就是32位,而byte是8位有符號,一般預設的int是32位帶符號位的
所以 oxa2(int) : 0000,0000,0000,1010,0010
而轉換位Byte後就是 1010,0010,但是因為Byte是帶符號位的,所以就成為了負數,因為計算機求值都是通過補碼來計算的
3、就是難一點的問題了>>>邏輯右移符號運算子
>>>是不論符號位是啥,前面都補0!
我們再來看看前面圖片的程式碼:
System.out.println(0Xa2 >>> 2); //40
這個比較簡單,用前面無符號定義就能解決
System.out.println((byte)0xa2 >>> 2); //1073741800
這個就麻煩很多了
前面以及提到int轉byte的問題了,這裡的轉到byte就是1010,0010,然後邏輯右移兩位,那就是簡單補0,為什麼成了這麼大的數了呢?
這是因為,java的int是4個位元組32位的,在控制檯進行輸出的時候,jvm把1010,0010之前進行了補全
補為補為11111111 11111111 11111111 1000 1000
java中,轉換時int輸出時 :
若byte符號位是0,如01001000,則進行int補0處理–>00000000 00000000 00000000 01001000;
若byte符號位是1,如11001000,則進行補1處理–>1111111 11111111 11111111 11001000
參考部落格:
Java>>與>>>的區別:
https://blog.csdn.net/qq_35402412/article/details/81156020
(byte)0x80>>2為什麼是-32 :
http://blog.sina.com.cn/s/blog_92f4203e0101a4rb.html
java中的二進位制int與byte互轉以及&0xff的作用:
https://blog.csdn.net/weixin_33547926/article/details/52385773