java二进制编码以及数据类型转换

一、 java的基本数据类型

 1.基本数据类型位数(字节数)

位数 1字节(8位) 2字节(16位) 4字节(32位) 8字节(64位)
类型 byte short int long
  boolean char float double

2.基本数据类型范围

java二进制编码以及数据类型转换_第1张图片

要记住byte的取值范围为   -128~127

 (1)float的表示

            

 符号位(1 bit) 指数(8 bit) 尾数(23 bit)

(2)double的表示

符号位(1 bit) 指数(11 bit) 尾数(52 bit)

所以,float和double都是可以表示正数和负数的

 

3.原码、反码、补码

二进制最高位为符号位,正数的原码,反码,补码相同

负数的反码:符号位不变,其余位取反

负数的补码:在反码基础上加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.自动类型转换

(1)不同类型进行计算时,会自动向范围高的数据类型自动转换

java二进制编码以及数据类型转换_第2张图片

特别注意: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会报错

  2.强制类型转换

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.强制转换时候,会取二进制数,对应的后几位为最终值(补码),然后计算补码对应的原值

 

 

 

你可能感兴趣的:(java基础)