java中「>>」和「>>>」運運算元的區別。

2020-10-16 11:02:53

java中「>>」和「>>>」運運算元的區別。

在學習它們兩者區別的時候最先知道的是: 無符號右移運運算元">>>" 右移之後左邊位數全部置為0,包括符號位。菜鳥教學上的解釋如下圖(其中A=0011 1100):
在這裡插入圖片描述

它們對正數操作之後,結果是相同的,但對負數的操作,結果卻有很大不同。

對正數操作範例程式碼和結果如下

		int a=16;
		int b=a>>>2;
		int c=a>>2;
		System.out.println("a>>>2之後二進位制表示為:"+Integer.toBinaryString(b));
		System.out.println("a>>>2 = "+b);
		System.out.println("a>>2之後二進位制表示為:"+Integer.toBinaryString(c));
		System.out.println("a>>2 = "+c);

在這裡插入圖片描述
對負數操作的範例程式碼可將a改為 -16 ,其結果如下

在這裡插入圖片描述
從對負數的操作結果可以明顯看出來執行「a>>>2」之後,結果大了好多倍,那為什麼會有這種差異呢?在計算機為了統一處理加減法操作,整數都是以二補數的形式儲存的。因為正數的二補數是其本身,所以兩種運運算元操作之後結果相同。但負數的二補數是(符號位保持不變)先取反碼,之後在反碼的最後一位+1而得到的。

在-16執行 a>>>2,前兩位被置0, 符號位發生改變,所以結果變為正數,結果中二進位制位數其實是30位。
在-16執行a>>2,為了保持其符號位不變,前兩位被置1,然後求得該二補數的原碼(二補數的二補數為原碼)即為其結果。

總結

兩者的區別主要在對負數的操作上,當執行無符號右移運算 >>> 時,移幾位左邊就填幾個0。而執行有符號運算 >> 時,為了保持其符號位不變,移位之後將其置為1。