文章目录
System.out.println("测试byte的范围:");
byte byte_127=127;
//byte byte_128=128;//报错
byte byte_m128=-128;
//byte byte_m129=-129;//报错
System.out.println("说明byte的范围是-128~127\n");
System.out.println("测试相互转换:低转高无需强转(超范围也需要强转),高转低需要强转");
byte byte_m129= (byte) -129;//超范围后int强转byte
int int_byte_m129=byte_m129;//强转的结果再赋给int
System.out.println("-129从int到b再到int:"+int_byte_m129);//结果为127;
// -129的编码如下:
// 原码 1000 0000,0000 0000,0000 0000,1000 0001
// 反码 1111 1111,1111 1111,1111 1111,0111 1110
// 补码 1111 1111,1111 1111,1111 1111,0111 1111
// 强转为byte后,直接截断 0111 1111 ,再转为int就是127
System.out.println("byte转为int:"+(int)byte_m128);//-128,说明byte转int会正常转换,低精度转成高精度的结果不会出错
// byte的-128补码: 1000 0000
// 转int后,左面拿符号位填充(右面0) 1111 1111,1111 1111,1111 1111,1000 0000
// 补码求补码等于原码
// 反码:1000 0000,0000 0000,0000 0000,0111 1111
// 原码:1000 0000,0000 0000,0000 0000,1000 0000 ==-128
System.out.println("Byte常用方法:");
//1.toString
//直接输出byte对象实际是调用的toString,而byte的toString是先将byte转成int,然后调用int的toString
//Byte.toString(byte b) {return Integer.toString((int)b, 10);}
//2.字符串转字节:parseByte(字符串,基数)
Byte k=Byte.parseByte("01111111",2);
// 源码只调用了 Integer.parseInt(string, radix);,有范围检查,只能输入0000 0000~0111 1111,最高位不能是1(bug)
System.out.println("字节码01111111:"+k);//127,符合预期
//Byte k1=Byte.parseByte("11111111",2);//报错,超范围,Integer.parseInt()后结果是255,超过范围-128~127,这应该是jdk的一个bug
//int k1=Integer.parseInt("11111111",2);//255
//为了解决任意字符串转字节,可以如下使用
byte t = (byte)Integer.parseInt("11111111", 2);//参数为原码,求反10000000,求补10000001,即-1
System.out.println(t);
//3.十进制转字节码字符串
String s1 = Integer.toBinaryString(-128);
System.out.println("-128的字节码字符串:"+s1);//11111111111111111111111110000000
//byte b1=Byte.parseByte(s1,2);//报错,Byte为8bit,给定32bit解析不了