首页 > 代码库 > byte和int的浅解

byte和int的浅解

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型的-8转换成32位int型后值还是-8?
--示例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"操作的过程。