1. 程式人生 > >關於java關於邏輯運算子和移位運算子的深入問題

關於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是帶符號位的,所以就成為了負數,因為計算機求值都是通過補碼來計算的

既然是負數,就要除符號位取反然後+1,來求得值,所以是-94

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