位数 | 1字节(8位) | 2字节(16位) | 4字节(32位) | 8字节(64位) |
类型 | byte | short | int | long |
boolean | char | float | double |
需要记住byte的取值范围为 -128~127
符号位(1 bit) | 指数(8 bit) | 尾数(23 bit) |
符号位(1 bit) | 指数(11 bit) | 尾数(52 bit) |
所以,float和double都是可以表示正数和负数的
二进制最高位为符号位,正数的原码,反码,补码相同
负数的反码:符号位不变,其余位取反
负数的补码:在反码基础上加1
java中用补码表示负数(强转计算的时候用的到)
例1. 以7和-7为例
7的原码,反码,补码 都是 0000 0111 最高位0表示正数
-7的原码反码补码对比:
7的原码 : 0000 0111
-7的原码:1000 0111
-7的反码:1111 1000
-7的补码:1111 1001
例2. -1,0,1的表示
java用补码表示二进制数
-1的补码:1111 1111
0的补码: 0000 0000
1的补码: 0000 0001
(1)不同类型进行计算时,会自动向范围高的数据类型自动转换
特别注意:byte,short和char参加计算时,会自动提升为int参加计算
比如 A. byte+byte,会把两个byte转换成int参加计算
B.byte+short 也会把两个转换成int参加计算
(2)特别需要关注的是long和float的数据范围:
float是32位,long是64位的,但是float表示的数字范围要大于long
所以记得整型会向浮点型自动转换就行了
(3)举例:byte b, b1,b2; b1=1;b2=2; b=b1+b2;会报错吗?
分析:byte 类型参与计算的时候提升为int,所以b1+b2是int类型,赋值给byte类型b会报错
A. 以 (byte)129 输出为-127为例
129在java中的二进制表示
0000 0000 | 0000 0000 | 0000 0000 | 1000 0001
(byte)129 强制转换后,byte是8位,则取最后8位 1000 0001
1000 0001是补码表示,最高位为符号位1说明是负数,
补码1000 0001对应反码为1000 0000
对应原码为1111 1111 还原数字为-127
B.以 (byte)150 输出为-106为例
150在java中的二进制表示
0000 0000 | 0000 0000 | 0000 0000 | 10010110
强制转换为byte后,取最后8位 10010110
10010110是补码,最高位为1说明是负数,
10010110还原为反码减一,为10010101
10010101还原为原码为11101010,对应-106
C.第三个例子,short类型最大值32767, (byte)32769 和(short)32769的输出值
0000 0000 | 0000 0000 |1000 0000 | 0000 0001 //32769的二进制表示
0000 0001 //(byte)32769的二进制表示,最高位为0,正数,值为1
1000 0000 | 0000 0001 //(short)32769的二进制表示,最高位为1,负数,此为补码
1000 0000 | 0000 0000 //(short)32769的反码
1111 1111| 1111 1111 //(short)32769的原码,-32767
所以 (byte)32769为1 ,(short)32769输出为 -32767
1.记住八种数据类型位数,字节数
2.byte的取值范围为 -128~127
3.自动类型转换顺序需要记住,float+long会向float转换,虽然long是64位的
4.byte ,char,short参加自动提升的时候,都是转变为int类型,byte+byte也是int类型
5.java中用补码表示负数,可以理解为java中的正数,负数都是用补码表示
6.强制转换时候,会取二进制数,对应的后几位为最终值(补码),然后计算补码对应的原值