前置知识点
byte的范围[-128~127] 内存里表现为 0x00~0xFF
刚好是一个8bits的字节
问题
byte[] hexData = new byte[] {0x01, 0x03, 0x04, 0x02, 0x1F, 0x01, 0x4E, 0x4B, (byte)0xE9 };Java先把括号里的识别为int数,然后再自动转换为byte
这里的int数0xE9,超出了byte的范围[-128~127],所以不会自动转换,必须代码指定强制转换。
那么问题来了,内存里是这样的
调试器结果:
而且打印出来的 (hexData[8]) 也是这样,所以不是调试器的问题,而是Java就是这么识别的。
解决
用 (hexData[8]&0xFF) 即可取出低位
揭秘
byte是有符号的,为了方便硬件运算,因此正负转换用了补码
Java所有数默认都识别为int,0xE9 被识别为 (int)233 超出了byte范围[-128~127]。
强制转换为byte后发生上溢,溢出了233-127=106,因此结果为 -1+(-128)+106=-23
-23的十六进制为 FFFFFFFFFFFFFFE9,也就是调试器里的那个数值
所以正数的时候没错,但负数的时候就需要处理了
对于 byte[-128,127], 其[0,127]范围的数据和 int 中的 [0,127] 完全一致,不需要 & 0XFF, 只有对于 [-128,-1] 的 byte 数据才需要 & 0XFF.
详见:对 byte & 0xFF 的理解
原文转载:http://www.shaoqun.com/a/740774.html
蜜芽:https://www.ikjzd.com/w/1320
数魔跨境:https://www.ikjzd.com/w/1425.html
前置知识点byte的范围[-128~127]内存里表现为0x00~0xFF刚好是一个8bits的字节问题byte[]hexData=newbyte[]{0x01,0x03,0x04,0x02,0x1F,0x01,0x4E,0x4B,(byte)0xE9};Java先把括号里的识别为int数,然后再自动转换为byte这里的int数0xE9,超出了byte的范围[-128~127],所以不会自动转换,
new old stock:https://www.ikjzd.com/w/2341
xinong:https://www.ikjzd.com/w/1368
promotion:https://www.ikjzd.com/w/127
Vcan:https://www.ikjzd.com/w/411
都在做跨境电商亚马逊无货源 但你真的知道优势在哪里吗?:https://www.ikjzd.com/home/17986
口述晚上我去妹妹房间里看见老公老公盯着我妹妹胸看还摸:http://lady.shaoqun.com/a/273932.html
没有评论:
发表评论