关于无符号右移出现的差值问题

对于无符号位移的问题,之前我在大学学习的时候知道对于无符号位移,仅仅是无论正负都将会得到一个正数,今天偶然间再看到时出现了一个让我困惑的问题【基础不牢,地动山摇,可怕】

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
因为正数的原码=补码=反码,所以得到的即为无符号位移的结果。

小伙伴们有时间了可以再看看数据结构和计算机组成原理,基础不牢地动山摇,工作时会让你莫名的surprise!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值