黑马程序员技术交流社区

标题: Java中byte转换int时与0xff进行与运算的问题 [打印本页]

作者: kid1943    时间: 2014-10-19 02:03
标题: Java中byte转换int时与0xff进行与运算的问题
    最近无意中查到了一些关于byte转int的代码
    代码片段如下
  1. public static String bytes2HexString(byte[] b) {
  2.   String ret = "";
  3.   for (int i = 0; i < b.length; i++) {
  4.    String hex = Integer.toHexString(b[i] & 0xFF);
  5.    if (hex.length() == 1) {
  6.     hex = '0' + hex;
  7.    }
  8.    ret += hex.toUpperCase();
  9.   }
  10.   return ret;
  11. }
复制代码

为什么 b&0xFF两个数相与后不是还是8位吗?为什么会变成int?

作者: HM2014nuli    时间: 2014-10-19 07:31
byte与int做运算,最终是会变成int类型的
作者: nerveva2000    时间: 2014-10-19 10:29
这里用到了 自动类型提升
  1. class Vardemo
  2. {
  3.         public static void main (String[] args)
  4.         {
  5.                 int  x = 3;
  6.                 byte b = 5;
  7.                 x = x + b;
  8.         //b原为byte型,因为x为int型,所以b自动类型提升为int型运算。
  9.        
  10.                 System.out.println(x);
  11.         }
  12. }
复制代码


数据类型自动提升
1 所有的byte型,short型和char的值提升为 int型
2 如果一个操作数是long型,计算结果就是long型
3 如果一个操作数是float型,计算结果就是float型
4 如果一个操作数是double型,解算结果就是double型
作者: 郭.威    时间: 2014-10-20 03:08
没看到这。。
作者: zhappy    时间: 2014-10-20 08:42
byte的8位,int是32位,在转换时,要把byte缺少的那24位全部补上0,&0xFF就是补0.我印象里是这么回事。

作者: kid1943    时间: 2014-10-20 16:18
nerveva2000 发表于 2014-10-19 10:29
这里用到了 自动类型提升

但这跟与运算又有什么关系呢?况且相与的两个数b 和0xff 都是8位
作者: kid1943    时间: 2014-10-20 16:19
HM2014nuli 发表于 2014-10-19 07:31
byte与int做运算,最终是会变成int类型的

0xff是int类型吗?
作者: nerveva2000    时间: 2014-10-20 16:41
kid1943 发表于 2014-10-20 16:18
但这跟与运算又有什么关系呢?况且相与的两个数b 和0xff 都是8位

上面是将byte[]转化十六进制的字符串,注意这里b & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b);,将byte强转为int不行吗?答案是不行的.

其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式

http://blog.csdn.net/zzycgfans/article/details/6782989
作者: kid1943    时间: 2014-10-21 10:11
nerveva2000 发表于 2014-10-20 16:41
上面是将byte[]转化十六进制的字符串,注意这里b & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.to ...

谢谢你 现在大概明白了 之前不理解是因为没看清楚toHexString所传的参数是int类型 ,还有这里的0xff可以是不是理解为0x000000ff呢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2