java的类型转换

0.在java中,整数默认为int类型,浮点数默认为double类型。

1.定义长整型(long)时,必须要加后缀L或l。 如long earthPeople=7_000_000_000L;

2.定义单精度(float)时,必须要加后缀F或f。 如float wage=2000.354f;

3.数值类型之间的转换:自动转换(隐式转换)      强制转换(显式转换)    

4.转换图  6个实心箭头表示无信息丢失的转换,3个虚线箭头表示可能有精度损失的转换

5.隐式转换:由小到大,数据类型自动提升

byteshortchar -->int  -->long -->float -->double

换一种说法:当使用两个数值进行二元操作时,首先要将两个操作数转换为同一类型,然后再进行计算。

转换规则:(一)两个操作数有一个是double类型,另一个操作数就会转换为double类型;

       (二)否则,有一个操作数是float类型,另一个操作数就会转换为float类型;

       (三)否则,有一个操作数是long类型,另一个操作数就会转换为long类型;

       (四)否则,两个操作数都将被转换为int类型。

 

byte a=20;

int b=a;

虚拟机会将赋值运算符右边的变量a转换为int类型,然后再赋值给左边的变量b。

例1

short a=10;

a=a+2;

//a=a+(short)2;这样也会报错,参考转换规则(四)

编译时会报错: 不兼容的类型: 从int转换到short可能会有损失

原因: a+2会隐式转换地将结果为int类型,将int类型赋值给左边的short类型变量,会有数据损失,所以会报错

处理办法:a=(short)(a+2);

 

对比

short a=10;

a+=2;     

此时不会报错。

a+=2;虽然可以看做a=a+2;,但还是有区别的。a+=2中有一个强制转换,a=(short)(a+2),会把a+2的值强制转换为short类型,故不会报错。

 

例2

short a=20;

short b=30;

b=a+b;

亦会报错,原因与例1同理

需要注意的是,在整数之间进行类型转换时,数值不发生改变。而将整数类型,特别是比较大的整数类型转换成浮点类型时,由于存储方式不同,有可能存在数据精度的损失。

int n=123456789;

float f=n;  //f=1.23456792E8

6.显式转换

格式: (转换后的数据类型)变量或值;

一般情况下,根本不推荐使用强制类型转换。

强制类型转换通过截断小数部分将浮点值转换为整型。

double x=9.997;

int y=(int)x; //y的值为9

例3

byte b=(byte)130;  

System.out.println(b);  //打印结果-126  

原因:

十进制数130转换为二进制:10000010

在内存中表示为

原码:00000000 00000000 00000000 10000010    因为是正数,所以原码反码补码都一样

补码:00000000 00000000 00000000 10000010

对补码进行截取,取剩下最后8位(即1个byte大小):10000010

10000010是补码。因为符号位是1所以该数是负数。

反码:10000001   ——>原码11111110

转换为十进制数为-126。

posted @ 2016-05-12 21:35  EdwardChu  阅读(1309)  评论(0编辑  收藏  举报