看看这段代码:
byte a = -124;
System.out.println(a);
System.out.println((a & 0xFF));
它输出:
-124
132
这对我来说非常非常令人惊讶。毕竟,byte
它只包含 8 位,因此不应在and
with 0xFF
(ie 11111111
) 之后更改它。
一个可能的原因是 Java在执行按位运算之前转换byte
为。int
是这样吗?如果是这样,为什么?
看看这段代码:
byte a = -124;
System.out.println(a);
System.out.println((a & 0xFF));
它输出:
-124
132
这对我来说非常非常令人惊讶。毕竟,byte
它只包含 8 位,因此不应在and
with 0xFF
(ie 11111111
) 之后更改它。
一个可能的原因是 Java在执行按位运算之前转换byte
为。int
是这样吗?如果是这样,为什么?
默认情况下,Java 使用 int 原始类型来表示数字。
如果要对 int 以外的类型的整数原语进行按位运算,可以显式转换操作数:
byte b = -124;
System.out.println("Byte: " + b);
System.out.println("Byte after bitwise and: " + (b & (byte) 0xFF));
上面的代码产生以下输出:
Byte: -124 Byte after bitwise and: -124
0xFF 确实是 int 类型。所以'a'在操作之前被提升为一个int。