有如下一段代码,运行结果在注释中给出
public class IoTest {
@Test
public void test() {
byte b = -127;
int c = b&0xff;
int d = b;
System.out.println(b); // -127
System.out.println(c); // 129
System.out.println(d); // -127
System.out.println(Integer.toBinaryString(c)); // 10000001
System.out.println(Integer.toBinaryString(d)); // 11111111111111111111111110000001
}
}
回顾Java里byte类型与int类型
byte
- 8位,有符号位,以二进制补码表示的整数。
- 范围:-128(-2^7) ~ 127(2^7-1)。
int
- 32位,有符号位,以二进制补码表示的整数。
- 范围:(-2^31) ~ (2^31-1)。
- 变量b是byte类型,对应十进制数为:-127,二进制为1000 0001。
- 变量c是int类型,int c = b&0xff 的过程为:
byte类型向int类型转换时,填充至32位,即b:1111 1111 1111 1111 1111 1111 1000 0001。
c = 1111 1111 1111 1111 1111 1111 1000 0001
& 0000 0000 0000 0000 0000 0000 1111 1111
= 0000 0000 0000 0000 0000 0000 1000 0001
对应十进制为:129。 - 变量d是int类型,byte类型向int类型转换时,填充至32位,即d:1111 1111 1111 1111 1111 1111 1000 0001,对应十进制为:-127。
通过 &0xff ,保证了当byte向int转换时,二进制的一致性。