在java中将byte转换为int的时,注意下记内容。
①首先byte的范围是(-128~127)
原因如下
byte在内存中一个字节,占八个位,最高位为符号位,
那么他取值范围为10000000~01111111;
注意:并不是11111111~01111111因为11111111表示-1是负数中最大的数。
接下来的问题就简单了,我们只要求出10000000的值就真相大白了。
首先,我们可以肯定10000000是个负数,而负数的补码是这样定义的:
该负数的绝对值的补码按位取反,然后对整个数加1。
假设 X:10000000
|x|的补码的反码:10000000 — 1 = 011111111 ; |x|的补码为:
10000000(01111111的反码), 也就是|x|与x的补码相同,都是10000000;
这种情况跟 -0和0的补码(同为00000000)是一样的。
毫无疑问10000000就是128,|x| = 128,那x当然就是-128了。
② byte转换为int后,由于int是32位,而byte只有8位这时会进行补位,
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111。
这时应该与0xff进行与运算。和0xff相与后,高24比特就会被清0了,结果就对了。
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111。
这时应该与0xff进行与运算。和0xff相与后,高24比特就会被清0了,结果就对了。
- public static int byteToInt2(byte[] b) {
- int mask=0xff;
- int temp=0;
- int n=0;
- for(int i=0;i<4;i++){
- n<<=8;
- temp=b[i]&mask;
- n|=temp;
- }
- return n;
- }