byte类型数据的范围
Java中byte类型数据的大小是一个字节,即8位,其范围为-128(1000_0000) ~ 127(0111_111),二进制最高位为符号位。
使用二进制形式赋值报错问题给byte类型的变量赋值只能在-128~127范围内。
可采用二进制形式赋值,如:byte b = 0b10011;
(b=19)。使用二进制赋值时,系统以补码的形式分析赋值的二进制数(例如0b10011
是19;对于0b1111_1101
则是-3)。
若要用二进制形式赋值一个负数,例如:byte b = 0b1001_0101;
,编译器会报告类型不兼容的错误(int不能给byte赋值)。强制转换需要添加类型:byte b = (byte) 0b1001_0101;
原因:(参考:JAVAByte数据类型二进制赋值运算报错)
byte有8个比特位,其中最高位是符号位,给它赋值0b1001_0101
当时,最高位1系统无法判断是实际值还是符号位值。添加强制类型转换(byte)
,系统可以知道1是符号位,此时可以赋值;如果没有强制类型转换,系统认为1是符号位。0b1001_0101
是int类型数据。int类型值不能赋值byte变量,因此会报错。
byte以二进制的形式输出,可以包装Integer
的静态方法toBinaryString(int i)
。
示例:
byte a = 2;byte b = 12;System.out.println(Integer.toBinaryString(a));System.out.println(Integer.toBinaryString(b));101100*/**输出
但是,如果用这种方法输出负数byte变量,结果是输出32位二进制数,如:
byte a = -2;System.out.println(Integer.toBinaryString(a));/**输出:111111111111111111111111111111111111110*///
这是因为byte值被赋值toBinaryString()
该方法被转换为int类型,即32位。上一个例子的正数也被转换为int,但因为它是正数,所以高0可以省略,所以它看起来正常显示;但对于负数,高1不能省略,所以以32位显示。
对于负数byte,可以截取结果的最后8位,如下:
public static void main(String[] args) throws IOException { byte a = -2; String aBinary = Integer.toBinaryString(a); aBinary = aBinary.substring(aBinary.length()-8); System.out.println(“原二进制数” + Integer.toBinaryString(a)); System.out.println(截取后的二进制数:" + aBinary);}/**输出:原二进制数:11111111111111111110截取后的二进制数:111110
一个Integer.toBinaryString()
处理byte值(正数,左补0;对于负数,截取后8位)的例子:
public class Test { public static void main(String[] args) throws IOException { byte a = 2; byte b = -2; String aBinary = getBinaryByteStr(Integer.toBinaryString(a)); String bBinary = getBinaryByteStr(Integer.toBinaryString(b)); System.out.println(aBinary); System.out.println(bBinary); } private static String getBinaryIntWithZero(String binary){ int zeroCount = 8 - binary.length(); String zeros = ""; if(zeroCount > 0){ for (int i = 0; i < zeroCount; i++) { zeros += 0; } } return zeros + binary; } /** * 获取8位二进制形式 */ public static String getBinaryByteStr(String b){ if(b.length()>8){ return b.substring(b.length()-8); } else { return getBinaryIntWithZero(b); } }}