byte类型的数字要&0xff再赋值给int类型,byte是一字节,而int类型是4字节,如果不做补码操作,就会导致二进制数据的一致性丢失掉,这个问题的产生的原因和计算机存储数据的方式有关,负数,会取反然后+1存储
基本数据类型
数据类型 | 字节 |
---|---|
byte | 8位二进制(8bit位) = 1个字节 |
char | 2个字节 |
short | 2个字节 |
int | 4个字节 |
long | 8个字节 |
float | 4个字节 |
double | 8个字节 |
数据的存储
计算机存储数据机制:正数存储的二进制原码,负数存储的是二进制的补码。 补码是负数的绝对值反码加1。
比如-12,-12 的绝对值原码是:0000 1100 取反: 1111 0011 加1: 1111 0100
byte –> int 就是由8位变 32 位 高24位全部补1: 1111 1111 1111 1111 1111 1111 1111 0100 ;
0xFF 是计算机十六进制的表示: 0x就是代表十六进制,A B C D E F 分别代表10 11 12 13 14 15 F就是15 一个F 代表4位二进制:可以看做 是 8 4 2 1。
0xFF的二进制表示就是:1111 1111。 高24位补0:0000 0000 0000 0000 0000 0000 1111 1111;
-12的补码与0xFF 进行与(&)操作 最后就是0000 0000 0000 0000 0000 0000 1111 0100
0xFF补码在java的应用
在JAVA颜色转码上会用到,当然颜色不可能为负数,基本上,不加上0xFF补码,也不会有问题的,但是最好是加上补码,这样保证了二进制的数据不会丢失
比如#0xFF0000 ,在java中转化为INT类型就需要补码写成
// 黑色
private static Integer COLOR_BLACK = 0XFF000000;
// 白色
private static Integer COLOR_WHITE = 0XFFFFFFFF;
// 红色
private static Integer COLOR_RED = 0xFFFF0000;