在學習它們兩者區別的時候最先知道的是: 無符號右移運運算元">>>" 右移之後左邊位數全部置為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。