Java中:byte转换为int ,int转换为long

本文探讨了在Java中如何处理字节(byte)到整数(int)的转换,特别是在处理无符号数据时可能出现的问题。当从远程设备接收到无符号的byte数据如0xfe时,直接转换为Java中的byte会得到负数,因为Java的byte是有符号的。为了解决这个问题,可以通过将byte转换为int并使用位操作符(&0xFF)来保持无符号值。对于超过int范围的数值转换,例如从int到long,文章介绍了两种方法,通过右移和位运算确保数值的正确扩展。这些转换技巧对于处理二进制数据和网络通信中的数据解析至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.byte转换为int
在Java语言中,byte 和 int都是有符号的,它们的数值都是用补码做计算的。
byte的数值范围是:-128 ~ +127 。高位为1表示负数,0表示正数。
如果在业务中遇到传输的数据是无符号的,就会存在问题。比如远程设备给我们传过来一个0xfe的数据:
0xfe,无符号的时候表示的是254,二进制为 11111110 。但是在Java程序里面,0xfe在byte中的值却表示的是-2 ,这就会出现问题。
如果用int数据类型来放0xfe,是没问题的。因为int虽然也是有符号的,但是它的表示范围为-2147483648到+2147483647,足够表示0xfe的值。
于是我们就需要byte转换为int做处理,需要注意的是,Java中扩展字节符号默认是不变的,也就是说高位补位全是1,需要做符号处理:

byte b = 0xfe;
int i = b;
i = i & 0xFF;

2.int转换为long
如果表示的范围超过了int的范围,同样也需要扩展,但是验证后发现使用&0xFFFFFFFF的方式并没用,需要使用其他的方法:

int k1 = 0xfeffffff;
long k11 = (k1 >>> 24) * 256 * 256 * 256L + ((k1 >>> 16) & 0xFF) * 256 *256 + ((k1 >>> 8) & 0xFF) *256 + (k1 & 0xFF);

或者

int k1 = 0xfeffffff;
long k12 = (k1 >>> 24) * 256 * 256 * 256L + (k1 & 0xFF0000) + (k1 & 0xFF00) + (k1 & 0xFF);

都可以实现正确地扩容,原来表示的无符号数据值可以保持相同的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值