符号なし右シフトの違いについて

符号なし変位の問題については、大学で勉強していたとき、符号なし変位の場合、正か負かにかかわらず、正の数になることを知っていました。今日、私を困惑させる問題を偶然目にしました。強く、地面が山を揺さぶる、それはひどい]

public class BitOperation {
    
    
    public static void main(String[] args) {
    
    
    //在这里我们假定设i的值为-10
         int i = -10;
    //无符号右移两位
         int j = i>>>2;
     //输出结果
        System.out.println("无符号位移的值为:"+j);
    }
}

以前の分析によると、次のように

public class BitOperation {
    public static void main(String[] args) {
         int i = -10;
      //二进制表示:
        // 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
        //右移两位,前面会补零 得到 :
        // 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
        //然后计算得到536870914
         int j = i>>>2;
        System.out.println("无符号位移的值为:"+j);
    }
}

しかし、結果は

public class BitOperation {
    
    
    public static void main(String[] args) {
    
    
    //在这里我们假定设i的值为-10
         int i = -10;
    //无符号右移两位
         int j = i>>>2;
     //输出结果
        System.out.println("无符号位移的值为:"+j);
    }
}

console
无符号位移的值为:1073741821

何故ですか?

在计算机内部数字的存储是以二进制的补码来进行存储的,也就是说,对于-10
原码 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
反码 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
补码 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0
接着进行无符号右移两位
得到 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
因为正数的原码=补码=反码,所以得到的即为无符号位移的结果。

時間があるときは、データ構造とコンピューター構成の原則を見ることができます。基盤がしっかりと揺らいでいないと、作業中に驚かれることでしょう。

おすすめ

転載: blog.csdn.net/MAKEJAVAMAN/article/details/106817135