Java 按位操作字节时会发生什么?

Java 按位操作字节时会发生什么?,java,bitwise-operators,Java,Bitwise Operators,请看下面的代码: byte a = -124; System.out.println(a); System.out.println((a & 0xFF)); 它输出: -124 132 这让我非常非常惊讶。毕竟,字节只包含8位,因此在和0xFF之后不应更改它(即11111111) 一个可能的原因是Java在执行逐位操作之前将字节转换为int。是这样吗?如果是,为什么?0xFF确实是一种int类型。因此,在操作之前,“a”被提升为int。0xFF确实是一种int类型。因此,在操作之前,

请看下面的代码:

byte a = -124;
System.out.println(a);
System.out.println((a & 0xFF));
它输出:

-124
132
这让我非常非常惊讶。毕竟,
字节
只包含8位,因此在
0xFF
之后不应更改它(即
11111111


一个可能的原因是Java在执行逐位操作之前将
字节
转换为
int
。是这样吗?如果是,为什么?

0xFF确实是一种int类型。因此,在操作之前,“a”被提升为int。

0xFF确实是一种int类型。因此,在操作之前,“a”被提升为int。

默认情况下,Java使用int原语类型表示数字

如果要对int以外类型的整数基元执行位运算,可以显式强制转换操作数:

byte b = -124;
System.out.println("Byte: " + b);
System.out.println("Byte after bitwise and: " + (b & (byte) 0xFF));
上面的代码生成以下输出:


默认情况下,Java使用int原语类型表示数字

如果要对int以外类型的整数基元执行位运算,可以显式强制转换操作数:

byte b = -124;
System.out.println("Byte: " + b);
System.out.println("Byte after bitwise and: " + (b & (byte) 0xFF));
上面的代码生成以下输出:


I是这样的,
字节
被转换为
int
,因为它被定义为so。I是这样的,
字节
被转换为
int
,因为它被定义为so。这是错误的原因,因为第一个输出中的
字节
也被转换为
int
。这是错误的原因因为第一个输出中的
字节
也被转换为
int