Java类型转换

今天对Java基本类型的转换有了一些新的认知,记录下来。

Java 基本类型转换

Java中数据类型主要分为两大类:基本数据类型和引用数据类型。基本数据类型共8种,分别为:布尔型 boolean 未知 字

符型 char 2字节 数值型 byte 1字节 short 2字节 int 4字节 float 4字节 long 8字节 double 8字节。

引用数据类型可分为:类,接口,数组。

在Java中,整数类型(byte/short/int/long)中,对于未声明数据类型的整形,其默认类型为int型。在浮点类型

(float/double)中,对于未声明数据类型的浮点型,默认为double型。

布尔类型boolean占有一个字节,由于其本身所代码的特殊含义,boolean类型与其他基本类型不能进行类型的转换(既不

能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。

基本数据类型之间的转换图:

img

在定义基本类型变量时,每种基本类型的取值范围是有限的,若定义值超出取值范围,则编译错误。Java整数类型取值范

围计算公式(-2^(n-1) 到 2^(n-1)-1),浮点类型取值范围为float:符号位1 + 幂值位8 + 数值位23,double:符号位1 +幂值

位11 + 数值位52。

超出取值范围错误原因:jvm在编译过程中,对于默认为int类型的数值时,当赋给一个比int型数值范围小的数值类型变量(在此统一称为数值类型k,k可以是byte/char/short类型),会进行判断,如果此int型数值超过数值类型k,那么会直接编译出错。因为你将一个超过了范围的数值赋给类型为k的变量,k装不下嘛,你又没有进行强制类型转换,当然报错了。但是如果此int型数值尚在数值类型k范围内,jvm会自定进行一次隐式类型转换,将此int型数值转换成类型k。这一点有点特别,需要稍微注意下。例如:

1
2
3
byte a = 1000;
float b = (float)3.12;
byte c = 3;

char类型转换特别之处:char型其本身是unsigned型,同时具有两个字节,其数值范围是0 ~ 2^16-1,因为,这直接导致byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为负数的问题),同时,byte当然可以直接提升到short型。

强制类型转换中,可能会出现负数的输出,如例:

1
2
3
int a = 233;
byte b = (byte)a;
System.out.println(b);

上面的例子中输出值是 -23.

为什么结果是-23?需要从二进制存储考虑。

233的二进制表示为:24位0 + 11101001,byte型只有8位,于是从高位开始舍弃,剩下:11101001,由于二进制最高位1表示负数,0表示正数,符号位不变取反,其相应的负数为-23。

若想求负数的二进制,有两种方法:方法①:则他的计算公式为 -N = ~N + 1, ~ 为取反的意思。方法②:用反码补码来计算。(先确定原码,再确定反码(原码符号位不变,其余位取反。),再确定补码(反码 + 1)。注:二进制在计算机中以补码的方式存放的。)例如:

1
2
3
4
-23 的二进制表达
首先确定-23的原码位 10111 加上符号位为 110111
再确定反码为 101000
再确定补码为 101001 再将位数补全(int类型) 加上26位1

当进行数学运算时,数据类型会自动发生提升到运算符左右之较大者,以此类推.当最会的运算结果赋值给指定数值类型时,可能会需要强制类型转换。例如:

1
2
3
int a = 9;
byte b = 1;
byte c = (byte)(a + b);

Java 按位取反运算符”~” 如何运算

正数的原码,反码,补码是一样的!既:

正数9(二进制为:1001)在内存中存储为01001,必须补上符号位(开头的0为符号位)。补码为01001,反码为01001,其中前面加的0是符号位,负数的符号位用1表示

负数-1(二进制为:0001)在内存中存储为10001,开头的1为符号位,在内存中存放为,11111(负数的补码是:符号位不变,其余各位求反,末位加1)既得到11111。 补码为11111 反码为11110

也就是说在求负数的反码.补码时,负数的补码是:符号位不变,其余各位求反,末位加1,既-1的补码为11111,反码是:符号位为1,其余各位求反,但末位不加1,既-1的反码为11110。反码 + 1既是补码。

1
2
3
4
实例: 求~8,计算步骤如下。
8的二进制 1000 则补码为:加上符号位 01000
取反为 10111 这是~8的补码 求反码既 -1 为 10110
符号位不变再次取反为原码 11001 既-9

参考

https://www.cnblogs.com/liujinhong/p/6005714.html

http://blog.csdn.net/smilecall/article/details/42454471