一、JAVA 中的byte类型
byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数。
在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。
负数补码 = 负数绝对值(正数) 符号位取反, 其余取反 +1
0000 0000 ~ 0111 1111 表示 0~127
1000 0000 比较特殊表示 -128, 因为0已经是有0000 0000 表示
1000 0001 ~ 1111 1111 表示 -127 ~ -1
e.g. 1000 0001 表示一个负数, 值补码为 000 0001 > 111 1110 (取反) > 111 1111 (+1) = 127 , 故 byte 1000 0001 表示 -127
同理 1111 1111 表示一个负数,值补码为 111 1111 > 000 0000(取反) > 000 0001 (+1) = 1, 故 byte 1111 1111 表示 -1
可以发现 byte 代表的最大值 +1 即变成了 最小值 :0111 1111 (127) + 1 = 1000 0000(-128)
二、byte & 0xFF
2.1 byte 与 int 的类型转换与截断
在 Java中 byte型数据在内存中占8位,int型数据在内存中占32位。0xff默认为int型,是十六进制。
0xFF: 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111 = 255
当 byte & 0xFF 时,先将byte 转 int : 正数 高补0 ,负数高补 1 (高位补符号位)。然后再截断成 byte (只取后8位)。
比如 :
byte i = 128; // 编译错
int a = (byte) 128 & 0xFF;
log.info("{}", a); // -128
当定义byte i 为 128时, 编译错,根据上面的分析 byte 类型最大只支持到 127.
**128 :: 0000 0000 | 0000 0000 | 0000 0000| 1000 0000 **
0xFF :: 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111
=> 0000 0000 | 0000 0000 | 0000 0000| 1000 0000 (与操作)
=> 1000 0000 byte类型截断,只取后面8位。(1000 0000 即代表的是 -128)
2.2 对于正数byte
对于 介于 0~127 的byte, 与上0xFF 即为其本来的值本身。
2.3 对于负数byte
byte = -1, 即 1111 1111。
byte = -1, 填充成int : 1111 1111 | 1111 1111 | 1111 1111 | 1111 1111
0XFF: 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111
0000 0000 | 0000 0000 | 0000 0000 | 1111 1111 => 255
byte= -56, 即 11001000
byte = -56, 填充成int:1111 1111 | 1111 1111 | 1111 1111 | 11001000
0XFF: 0000 0000 | 0000 0000 | 0000 0000 | 1111 1111
0000 0000 | 0000 0000 | 0000 0000 | 11001000 => 200
2.4 负数补码与补码对应正数的关系
比如负数-56补码:11001000 ,最高位1代表符号位。
现在把对应的11001000,认为是一个正数,即无符号位数, 则变成 200。
其实可以归纳总结出:
我们上面假设的数据x为有符号的数据,那么现在我们可以把x转换为无符号数据,计算原理如下
当8位时,w=8,即负数+256 => 无符号数
2.5 意义
byte & 0xFF : 将byte转化成一个0-255之间的数字,这个数字有可能不是原本的byte本身(因为负数的情况)。 但是将转成的int强制类型转换为 byte 就又回去。(恢复成了原来的byte的值)
@Slf4j public class test {
@Test public void test01() {
byte b = -128;
int a = b & 0xff;
log.info("byte {} converse to int(0~255): {}", b, a);
log.info("int {} converse to byte: {}", a, (byte) a);
}
}
12:38:47.594 [main] INFO ch3.test - byte -128 converse to int(0~255): 128
12:38:47.597 [main] INFO ch3.test - int 128 converse to byte: -128