luofei6250 2015-09-28 12:26 采纳率: 33.3%
浏览 3246

java类型转化之int转换为byte[]

小白想请问一个问题:
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位。

  • 写回答

5条回答 默认 最新

  • threenewbee 2015-09-28 15:29
    关注

    之后的0xff的作用就是只取最后的一个字节,相当于

    bytes[1] = (byte)((Num >> 8) & 0xff );
    ->
    bytes[1] = (byte)((Num >> 8) % 256 );
    ->
    bytes[1] = (byte)((Num / 256) % 256);
    这些都是一回事

    评论

报告相同问题?

悬赏问题

  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件
  • ¥15 visual studio2022中文乱码无法解决
  • ¥15 关于华为5g模块mh5000-31接线问题
  • ¥15 keil L6007U报错