有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么9&0xaaaa会得到一个未签名的结果?

convertToBinary方法用于显示8位二进制数

public static String convertToBinary(int a){
    String binary="";
    for(int i=0;i<8;++i){
        Integer bit=new Integer(a&1);
        binary=bit.toString()+binary;
        a>>=1;
    }
    return binary;
}

public static void main(String[] args) {
    int a=-9;
    System.out.println(convertBinary(a));            //11110111
    System.out.println(convertBinary(0xaaaa));       //10101010
    System.out.println(convertBinary(a&0xaaaa));     //10100010
    System.out.println(convertBinary((a&0xaaaa)>>1));//01010001
}

最后一个结果证明a&0xaaaa的结果是无符号的,有人能解释为什么吗


共 (2) 个答案

  1. # 1 楼答案

    最后一个结果并不能证明>>进行了无符号移位(说值是无符号的是没有意义的,值只是一堆位,有符号或无符号的是操作

    由于您只打印8位,因此没有查看24个高位,因此您没有看到唯一受x >> 1x >>> 1之间差异影响的位,这是最高位。有符号移位和无符号移位之间没有任何区别,所以根据这个结果,你不能说发生了什么

  2. # 2 楼答案

    a是一个int,文字a&0xaaaa也是。按位and运算的结果也是int。它有32位。与

    a&0xaaaa
    

    你已经屏蔽了a中除了最低位以外的所有位。结果是一个正的32位int值。所以通过打印出最低的8位

    (a&0xaaaa)>>1)
    

    你所揭示的只是^{中第9位的值

    请注意,位掩码0xaaaa,即使有一个有缺陷的假设,即它不比使用的数字宽,仍然是一个16位的值,并且只打印较低的8位