1.byte范围为什么是(-128~127)?
--byte是8位
--这里定义2种8位展现形式:1,符号形式(第一眼看符号位,判断正负,然后计算剩下7位的数值)。2,存储形式(内存中都是补码存储)
--想要知道一个数在内存中如何存储?真值 >> 符号形式 >> 补码 >> 存储形式
--示例1:
+8(真值)
+8(符号形式):0000 1000,//真值"+8",因为是"+",所以将第一位定义为0,因为值是"8",所以剩余7位是"000 1000"。
+8(补码): 0000 1000
+8(存储形式):0000 1000,//因为正数的补码就是本身,所以内存中的存储形式是"0000 1000"。
--示例2:
-8(真值)
-8(符号形式):1000 1000,//真值"-8",因为是"-",所以将第一位定义为1,因为值是"8",所以剩余7位是"000 1000"。
-8(反码): 1111 0111,
-8(补码): 1111 1000,
-8(存储形式):1111 1000,//经过取补码后,-8在内存中的存储形式是"1111 1000"
--已经知道一个数在内存中的存储形式,求这个数?存储形式 => 符号形式 >> 补码 >> 符号形式 >> 真值(注意:这里是"=>",不是">>",表示把"存储形式"当成"符号形式"使用")
--示例1:
+8(存储形式):0000 1000
+8(符号形式):0000 1000,//把"0000 1000"当前符号形式,第一位是"0",说明这个数是正数,所以补码为本身
+8(补码): 0000 1000,
+8(符号形式):0000 1000,//第一位是"0",那么这个真值的符号是"+",后面7位是"000 1000",数值是"8"
+8(真值): //所以真值是+8
--示例2:
-8(存储形式):1111 1000
-8(符号形式):1111 1000,//把"1111 1000"当前符号形式,第一位是"1",说明这个数是负数,需要计算其补码
-8(反码): 1000 0111,
-8(补码): 1000 1000,
-8(符号形式):1000 1000,//第一位是"1",那么这个真值的符号是"-",后面7位是"000 1000",数值是"8"
-8(真值): //所以真值是-8
--验证:(byte)-8的存储形式是"1111 1000"
int i = -8;
System.out.println(Integer.toBinaryString(i)); //打印int类型在内存中的2进制表示,"1111 1111,1111 1111,1111 1111,1111 1000"
System.out.println((byte)i); //打印"-8",此时byte类型的-8的内存表示为int类型出去左边24位,也就是"1111 1000"是byte型-8的存储形式,和上述例子中的结果相符
--那么上面的这些例子和证明byte的范围有什么关系呢?
--byte为8位,所以要么全为"0000 0000",要么全部为"1111 1111",因为第一位是符号位,所以可以分为以下3部分。
--正数的范围: 0000 0001(代表+1) ~~ 0111 1111(+127)
--0的存储形式:0000 0000
--负数的范围: 1000 0000(代表-128) ~~ 1111 1111(-1)
--以上都是存储形式,正数和0就不解释了,解释下负数的范围:
--(1000 0000)求解过程:
(存储形式):1000 0000
(符号形式):1000 0000,//第一位是"1",说明这个数是负数,需要计算其补码
(反码): 1111 1111,
(补码): 1000 0000,//第一位是"1",那么这个真值的符号是"-",后面7位的反码是"111 1111",补码是"1000 0000",数值是"128"
(符号形式):1000 0000,//真值是"-128",
--(1111 1111)求解过程:
(存储形式):1111 1111
(符号形式):1111 1111,//第一位是"1",说明这个数是负数,需要计算其补码
(反码): 1000 0000,
(补码): 1000 0001,//第一位是"1",那么这个真值的符号是"-",后面7位的反码是"000 0000",补码是"000 0001",数值是"1"
(符号形式):1000 0000,//真值是"-1",
2.int >> byte
--(1).假设int的取值范围是(-128~127):
--示例1:
int i = 64;
System.out.println(Integer.toBinaryString(i)); //存储形式:0000 0000,0000 0000,0000 0000,0100 0000
System.out.println((byte)i); //去除左边24位,剩余"0100 0000",这是存储形式,通过上述例子中的逆转方式,打印64
--示例2:
int i = -64;
System.out.println(Integer.toBinaryString(i)); //存储形式:1111 1111,1111 1111,1111 1111,1100 0000
System.out.println((byte)i); //去除左边24位,剩余"1100 0000",这是存储形式,通过上述例子中的逆转方式,打印-64
--(2).假设int的取值范围是(>127,<-128):
--示例1:
int i = 128;
System.out.println(Integer.toBinaryString(i)); //存储形式:0000 0000,0000 0000,0000 0000,1000 0000
System.out.println((byte)i); //去除左边24位,剩余"1000 0000",这是存储形式,通过上述例子中的逆转方式,打印-128
--示例1:
int i = -129;
System.out.println(Integer.toBinaryString(i)); //存储形式:1111 1111,1111 1111,1111 1111,0111 1111
System.out.println((byte)i); //去除左边24位,剩余"0111 1111",这是存储形式,通过上述例子中的逆转方式,打印127
3.byte >> int,有这样一个疑问,为什么8位byte型的-1转换成32位int型后值还是-1?
--示例1:
byte b = 8; //byte存储形式:0000 1000
System.out.println((int)b); //因为"8"是正数,所以在左边补充24位"0"
//int存储形式:0000 0000,0000 0000,0000 0000,0000 1000,通过上述例子中的逆转方式,所以int的数值也是8
--示例2:
byte b = -8; //byte存储形式:1111 1000
System.out.println((int)b); //因为"8"是负数,所以在左边补充24位"1"
//int存储形式:1111 1111,1111 1111,1111 1111,1111 1000,通过上述例子中的逆转方式,所以int的数值也是-8
4.最近看到一种byte转int的写法"byte & 255"或"byte & 0xFF",以下是解析其过程转换。
int getInt(){
byte b = -8;
return b & 255;
}
--解析过程:
byte b = -8; //byte存储形式: 1111 1000
//那么int存储形式: 1111 1111,1111 1111,1111 1111,1111 1000
//255的int存储形式: 0000 0000,0000 0000,0000 0000,1111 1111
//进行&操作: 0000 0000,0000 0000,0000 0000,1111 1000,打印结果就是248
//int转byte型,去掉左边24位: 1111 1000,通过上述例子中的逆转方式,打印-8,所以是不冲突的,这里只解释"&255"操作的过程。
|
|