为什么 -9 & 0xaaaa 得到一个无符号的结果?

Why does -9 & 0xaaaa get an unsigned result?

convert To Binary方法用于显示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的结果是无符号的,谁能解释一下为什么?

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

a&0xaaaa

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

的最低 8 位
(a&0xaaaa)>>1)

你透露的只是a&0xaaaa中第9位的值。

请注意,位掩码 0xaaaa,即使有缺陷的假设它不比所使用的数字宽,仍然是 16 位值,而您只打印低 8 位。

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

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