java int与byte类型转换的2种方法

版权声明:本文为博主原创文章,转载请注明原地址,谢谢 https://blog.csdn.net/QuinnNorris/article/details/74859515

int是四字节,32位数。byte是一字节,8位数。在日常的格式转换中,我们只需要将byte类型数据前加括号加(int)即可转换成int类型数据。但是最近接触到一种全新的转换方法,虽然得到的结果是相同的,但在某些特殊情况时会用到。

第一种方法(普通):

int a = (int) aByte;

常规方法,我们只需要将byte数据类型前加上int关键字即可。

第二种方法:

第一种方法可以应付绝大多数的情况,但是上述的方法存在问题。

当byte类型数字是正数时没问题,但byte为负数时将byte转换为int会发生位扩展。举个例子,如果在byte中存储数字-1,根据存储方法,1在byte中存储形式是(二进制)0000 0001,那么-1即是1的补码(1111 1110)再加上1,即:11111111。用十六进制表示是:0xff。如果我们采用第一种方法转换,java为了保证int中数字的正确,会将int的高24位(int有32位,byte有8位,32-8=24)置为符号位(byte的符号位是最高位),-1的符号位是1,所以int中存放的-1是32个1的形式,用16进制表示为0xffffffff。

上面已经说明了如果采用第一种方法会发生什么内部变化,下述问题进一步解释我们为什不能采用第一种方法而需要另外一种方法来进行类型转换。

问:给你一个byte数组,让你将byte数组中的各个字节连起来以字符串的形式输出。
答:这段逻辑的编写思路是使用Integer.toHexString( )方法将数字类型值以16进制字节的形式输出。但该方法只能传入int类型的数据做参数,所以需要将byte数据转换成int类型数据。

上述问题需要我们将byte数据转换成int类型数据,而且要保证每位在int中的存放情况和byte是相同的。显然,第一种方法已经不能满足我们的需求。我们需要找到一种方法,使得byte转为int类型时字节情况不变。

int a = aByte & 0xff;

这就是我们的第二种方法,将字节数据与0xff相与。&(与)操作会将两个都为1的位返回1其他情况返回0。在java中0xff默认为整形,即0xff等同于0x000000ff。所以等号右边的与操作结果是一个32位(8字节)数,且高24位(高6字节)是0,这样a的值为0x000000ff,即a的末八位是byte数据的八位数据。

需要我们注意的是,这样的转换会使得a的值和byte的值不等,比如此例中byte为-1,a的值为225。但是我们的目的本来就是为了保存byte各位的情况,所以不关系数值是否相等。

package Test;

public class test {
    public static void main(String[] args) throws Exception {

        byte bs = -1;
        System.out.println(Integer.toHexString((int)bs));
        //ffffffff
        System.out.println((int)bs);
        //-1

        int bt = bs & 0xff;
        System.out.println(Integer.toHexString(bt));
        //ff
        System.out.println(bt);
        //255

    }

}
展开阅读全文

没有更多推荐了,返回首页