我不理解以下代码的输出:

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);
}


输出:

i1: 128   b: -128   i2: -128   i3: -128   i4: 128


因为byte是8位two's-complement有符号整数,所以最高有效位为1的二进制表示形式被解释为负值,这就是为什么b变为-128的原因,我对此完全满意。我也理解,与i2一样,在转换时保持解释一致可能是一个好主意。但是i3i4不应具有相同的位模式并因此映射到相同的int值吗?

最佳答案

符号扩展是使i2i3变为负数的原因。

在表达式(0 | b)中,b被提升为int,并且符号扩展是此提升的一部分。

在分配给i4的表达式中没有发生这种情况。常量17已经是整数,因此不涉及符号扩展。

09-06 17:45