我不理解以下代码的输出:
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
一样,在转换时保持解释一致可能是一个好主意。但是i3
和i4
不应具有相同的位模式并因此映射到相同的int
值吗? 最佳答案
符号扩展是使i2
和i3
变为负数的原因。
在表达式(0 | b)
中,b
被提升为int,并且符号扩展是此提升的一部分。
在分配给i4
的表达式中没有发生这种情况。常量1
和7
已经是整数,因此不涉及符号扩展。