java byte >>_java byte

项目中有段代码,一直让我疑惑不解,但我是个很会偷懒的人,只要拷贝来改改能用的代码,万万不会自己动手写,虽然一直有疑惑,也懒得搭理是怎么个原理。

直到今天,又要解析协议,又要动这个地方的代码,还是来盘他吧。

看下面这个flag的值,我一直想不明白的就是这个,short是两个字节的,取值范围 “-32768 (-2的15此方) -- 32767 (2的15次方-1)”,这个byte明明只取了第15位上的一个数,比如 0xF4 ,怎么就变成了负数-12,明明可以放下的,明明是244。

117595c509aae0c4974e0b6adfa4caa3.png

4c05d44c648b11a45880d63c3db7527a.png

直到今天细细看了下,才解了疑惑,这个 0xF4 是存储在 byte[]  数组里的,那么取出来的时候 0xF4 已经是 byte 类型的一个值了,byte是1个字节的,取值范围是 -128 ~ 127 ,明显244已经超过了127,最高位被当做符号位来处理了,自然就变成了负数,想要用无符号位来接收这个值,存储到更大的存储单元,比如short,就得取按位与 0xFF 以后的 short 值。

flag 其实就是 (byte) 0xF4(short) (flag & 0xFF) -- 这个才是按照无符号位取出来的 short 值,也就是244

下面附上一些查阅的资料:

1、byte与int转换

public staticbyte intToByte(intx) {

return (byte) x;

}

public staticint byteToInt(byteb) {//Java 总是把 byte 当做有符处理;我们可以通过将其和 0xFF 进行二进制与得到它的无符值

return b & 0xFF;

}2、byte[]与int转换

public staticint byteArrayToInt(byte[] b) {

return b[3] & 0xFF |(b[2] & 0xFF) << 8 |(b[1] & 0xFF) << 16 |(b[0] & 0xFF) << 24;

}

public staticbyte[] intToByteArray(inta) {

return newbyte[] {

(byte) ((a >> 24) & 0xFF),

(byte) ((a >> 16) & 0xFF),

(byte) ((a >> 8) & 0xFF),

(byte) (a & 0xFF)

};

}

0231a37add7532a90fe16f569cf3b8b4.png

一、基本数据类型的特点,位数,最大值和最小值。1、

基本类型:short 二进制位数:16包装类:java.lang.Short

最小值:Short.MIN_VALUE=-32768 (-2的15此方)

最大值:Short.MAX_VALUE=32767 (2的15次方-1)2、

基本类型:int 二进制位数:32包装类:java.lang.Integer

最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)

最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)3、

基本类型:long 二进制位数:64包装类:java.lang.Long

最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方)

最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)4、

基本类型:float 二进制位数:32包装类:java.lang.Float

最小值:Float.MIN_VALUE=1.4E-45 (2的-149次方)

最大值:Float.MAX_VALUE=3.4028235E38 (2的128次方-1)5、

基本类型:double 二进制位数:64包装类:java.lang.Double

最小值:Double.MIN_VALUE=4.9E-324 (2的-1074次方)

最大值:Double.MAX_VALUE=1.7976931348623157E308 (2的1024次方-1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值