java中byte与int的转换原理

前些天遇到一个问题,byte[0] = "A3"(十六进制表示) 但是在debug时显示的是 -93 ,而如果直接赋值给int的变量也是-93.当然大部分人都知道这是不能直接赋值的,需要以下面的这种方式将byte转换成int:

int temp = byte[0] & 0xFF;
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

因为以前没有做过直接的byte数据的转换,前几天需要判断前两位的byte为"A3" "xx"作为一种类型的判断,才发现好像对这种计算机内部基本类型byte,int的二进制存储和计算不明白原理, 今天就将这部分的理解记录下来。

我们分几个步骤记录这部分知识

  1. byte 十六进制的 “A3” 为什么会显示是 -93
  2. &运算符的计算原理
  3. byte & 0xFF的运算过程以及为什么要这个运算后才赋值给int类型的变量

1. “A3”  —>    -93

首先byte类型是8 bit (8个0/1) , "A3"  --> 1010 0011 ,  jvm虚拟机内部存储的是int类型(4字节 32bit)时是直接将最高位(就是最左边)的值补到高位的24bit, 于是“A3”  --> 1111 1111 1111  1111 1111 1111 1010 0011 (这里是将最高位的1 补到24bit高位).这个二进制表示是计算机内部存储地表示,而计算机内部是以补码的方式存储地,也就是说这个不是真正的值,只有将这个转换成原码才是真正的值。

简单说明一下原码,反码,补码。 正整数的原码,反,补码都是一样的,不用进行转换。负整数的原码,最高位时1,这个不变,将除最高位意外的全部取反,1变成0 ,0变成1,就是反码了,然后将反码+1(以二进制的形式计算)得到的就是补码。那么从补码返回到原码就是先-1,然后将除最高位以外的都取反得到原码。

补码: 1111 1111 1111  1111 1111 1111 1010 0011    —>   -1

反码: 1111 1111 1111  1111 1111 1111 1010 0010    —>  除最高位  全取反

原码 :1000 0000 0000 0000 0000 0000 0101 1101   ——> -(64+16+8+4+1) = -93

这就是为什么“A3”的byte直接赋值给int后会是 -93的原因。

而我们经过之前的分析会发现,当byte的最高位为1时,也就是以上的情况时,byte的值就会从正整数变为负整数了自然也就是错了。当byte的最高位为0时,因为byte存储时补齐24bit高位时用的是0补了24个0 值也就没有变,数值也就是正常的。

2. &运算符  | 运算符

& 这个其实也比较的简单:

1 & 1  --> 1

(1 & 0)  (0 & 1)  (0 & 0)  --> 0

也就是说只有1 & 1 时候才为1 只要有0 结果都是0

| 这个就相反的了

0 | 0 --> 0

(1 & 0)  (0 & 1)  (1 & 1)  --> 1

也就是说只有0 & 0 时候才为0 只要有1 结果都是1

3. &0xFF的意义

其实到了这个时候,我们都明白就是要将 当byte最高位为1时,补的24bit高位的1转换成0 那么值就是正确的。而&0xFF(这是个int类型的值 )这个操作就是起到这个作用(0xFF -->  0000 0000 0000 0000 0000 0000 1111 1111)(谢谢 评论里的回复):

1111 1111 1111  1111 1111 1111 1010 0011 

&

0000 0000 0000 0000 0000 0000 1111 1111

这个的计算结果就是 24bit高位全部为0 ,而8bit低位保持原样。

嗯,byte 转成 int 就完了。

还有一个int 转换成 byte的情况,不过呢因为byte只有8bit因此需要byte[4]数组存储这个int,我就记录一下:

int temp = 1009020;
byte[0] = (byte)(temp >> 24 & 0xFF);
byte[1] = (byte)(temp >> 16 & 0xFF);
byte[3] = (byte)(temp >> 8 & 0xFF);
byte[4] = (byte)(temp  & 0xFF);
//0为高位 2,3,4依次为低位

原理其实就是将32bit , 以8bit为一段分割了一下, 也就是 >> 8( 倍数)移位了一下,然后其他就如之前一样。

记录一下几个重要的点

  • 计算机内部存储时是以补码的形式存储,如果是负整数,需要转换
  • jvm虚拟机存储byte类型值是以4个字节存的,也就是会在24bit高位补byte最高位的值
  • &运算符的规则

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值