小白想请问一个问题:
java中将int转换为byte[]数组时,我参考网上的代码如下:
public byte[] int2bytes(int Num){
byte[] bytes = new byte[4];
bytes[0] = (byte)(Num & 0xff);
bytes[1] = (byte)((Num >> 8) & 0xff );
bytes[2] = (byte)((Num >> 16) & 0xff);
bytes[3] = (byte)((Num >> 24) & 0xff);
return bytes;
}
我想问的是,之后的0xff的作用到底是什么。
我的疑惑如下:
①网上的说法是:0xff的二进制第一个字节11111111,其他三个字节均是0,按位与之后,将位运算之后的int低8位之外的24位清零,可是int强制转换为byte是只取了最后的低8位吧,那么前面的是不是0是有什么关系呢。如下:
原数据int: 00000000 00101001 00001010 00010110
位运算>>8: 00000000 00000000 00101001 00001010
& 0xff : 00000000 00000000 00000000 00001010
转换byte : 00001010
按照这样的流程,如果不进行& 0xff操作,直接将位运算之后强制转换,结果应该如下:
原数据int: 00000000 00101001 00001010 00010110
位运算>>8: 00000000 00000000 00101001 00001010
转换byte : 00001010
既然网上的代码都是这样写,肯定有其中的道理,那么我的理解错误点在哪里呢?
②我将此段代码,传参-1024调用,并循环输出byte[4]的元素发现返回结果是一样的
有&0xff:0 -4 -1 -1
无&0xff:0 -4 -1 -1
还请指点,非常感谢。
更新:我后来想了下。觉得这应该是从别的语言里面借鉴过来的写法。
在java中byte的取值范围是127~-128,而int为4个byte,那么可能在位运算之后,不进行& 0xff按位与之后可能存在int的第一个字节和第二个字节均不为零的情况,那么此时int的值实际上是超过了byte的取值范围,在别的语言里可能会造成溢出。
但是,我刚试验过了。java中实际上这种转换不会抛出错误,比如直接将280转换成byte,则直接砍掉前面的14位,只取后面8位。