Java:为什么二进制OR不按预期工作(参见下面的代码)?

Han*_*etz 1 java binary

我不明白以下代码的输出:

public static void main(String[] args) {
    int i1, i2, i3, i4;
    byte b;
    i1 = 128;
    b = (byte) i1;
    i2 = (int) b;
    i3 = 0 | b;
    i4 = 1 << 7;
    System.out.format("i1: %d   b: %d   i2: %d   i3: %d   i4: %d\n", i1, b, i2, i3, i4);
}
Run Code Online (Sandbox Code Playgroud)

输出:

i1: 128   b: -128   i2: -128   i3: -128   i4: 128
Run Code Online (Sandbox Code Playgroud)

因为byte是一个8位二进制补码有符号整数,所以在最高有效位中带有1的二进制表示被解释为负值,这就是为什么b变成了-128,我完全没问题.我也明白,在施法时保持解释一致可能是一个好主意,如同i2.但是不应该i3并且i4具有相同的位模式,因此映射到相同的int值?

Aln*_*tak 5

在这一行:

i3 = 0 | b;
Run Code Online (Sandbox Code Playgroud)

int由于|运算符,"b"变量会自动提升为带符号扩展名的类型,因此变为(int)-128,即0xffffff80.

当"或"ed为零时,它仍然是相同的值,即-128