黑马程序员技术交流社区

标题: byte和int的浅解 [打印本页]

作者: 沐子松/kf    时间: 2014-7-7 01:02
标题: 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型的-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"操作的过程。


作者: 曾倩倩    时间: 2014-7-7 09:32
整理的不错!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2