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

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 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?