java byte
項目中有段代碼,一直讓我疑惑不解,但我是個很會偷懶的人,只要拷貝來改改能用的代碼,萬萬不會自己動手寫,雖然一直有疑惑,也懶得搭理是怎么個原理。
直到今天,又要解析協議,又要動這個地方的代碼,還是來盤他吧。
看下面這個flag的值,我一直想不明白的就是這個,short是兩個字節的,取值范圍 “-32768 (-2的15此方) -- 32767 (2的15次方-1)”,這個byte明明只取了第15位上的一個數,比如 0xF4 ,怎么就變成了負數-12,明明可以放下的,明明是244。
?
直到今天細細看了下,才解了疑惑,這個 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 static byte intToByte(int x) { return (byte) x; } public static int byteToInt(byte b) { //Java 總是把 byte 當做有符處理;我們可以通過將其和 0xFF 進行二進制與得到它的無符值 return b & 0xFF; } 2、byte[]與int轉換 public static int byteArrayToInt(byte[] b) { return b[3] & 0xFF | (b[2] & 0xFF) << 8 | (b[1] & 0xFF) << 16 | (b[0] & 0xFF) << 24; } public static byte[] intToByteArray(int a) { return new byte[] { (byte) ((a >> 24) & 0xFF), (byte) ((a >> 16) & 0xFF), (byte) ((a >> 8) & 0xFF), (byte) (a & 0xFF) }; }?
一、基本數據類型的特點,位數,最大值和最小值。 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)?
轉載于:https://www.cnblogs.com/LcxSummer/p/10396486.html
總結
- 上一篇: C#排队处理DEMO
- 下一篇: 多项式多点求值