JAVA中byte转int遇到的问题

byte z = (byte) 0x88;
int zInt = z;

此时如果打印z还有zInt, 会得到-120, 可是0x88明明是136呀
0x88 = 10001000= 128 + 8 = 36
但是如果这样做

byte z = (byte) 0x88;
int zInt = z & 0xff;

这时候就能得到z是-120, zInt就是136.
这时候有两个问题:

  1. 为什么前者总是-120
  2. 为什么后者& 0xff就能得到正确的值

/**
* byte在内存中是以补码的形式存储的, 比如0x88, 存储形式是1111 1000, 显示成int就是-120
* 实际上我们一位0x88的值是1000 1000也就是136
* 当0x88的byte数直接转成int就变成了-120
* 如果将0x88的byte数与上0xff, 然后赋值给int就是00000000 00000000 00000000 10001000, 也就是0x00 0x00 0x00 0x88
* 所以作为int操作之前要将byte & 0xff
*
* 其实我们并不用关心内存中补码是如何运算的, 大概可以理解成补码会变成原码, 然后参与实际运算
* 补码的问题, 当byte强转int的时候会出现, 因为byte有符号位, 符号位让byte的范围[-127, 127]
* 当源码是正数的时候, 比如0x33, 最高位是0, 这个问题不会出现, 转成int之后还是51
* 当源码是负数的时候, 比如0x88, 最高位是1, 补码就是反码+1, 转成int之后就是-120
* 在进行负数 & 0xff 的时候, 程序回自动求原码, 得到原码以后再进行 & 0xff 运算, 这样就避免了由于补码强转成int造成的问题,
* 当进行 & 0xff后"赋值"给int的时候, 程序不会认为是强转, 而认为是位运算的结果的一个"赋值"操作
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值