符号なし変位の問題については、大学で勉強していたとき、符号なし変位の場合、正か負かにかかわらず、正の数になることを知っていました。今日、私を困惑させる問題を偶然目にしました。強く、地面が山を揺さぶる、それはひどい]
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
因为正数的原码=补码=反码,所以得到的即为无符号位移的结果。
時間があるときは、データ構造とコンピューター構成の原則を見ることができます。基盤がしっかりと揺らいでいないと、作業中に驚かれることでしょう。!!