整型:
byte:-2^7 ~ 2^7-1,即-128 ~ 127。1字节。Byte。末尾加B
short:-2^15 ~ 2^15-1,即-32768 ~ 32767。2字节。Short。末尾加S
有符号int:-2^31 ~ 2^31-1,即-2147483648 ~ 2147483647。4字节。Integer。
无符号int:0~2^32-1。
long:-2^63 ~ 2^63-1,即-9223372036854774808 ~ 9223372036854774807。8字节。Long。末尾加L。(也可以不加L)
浮点型:
float:4字节。Float。末尾加F。(也可以不加F)
double:8字节。Double。
字符型:
char:2字节。Character。
布尔型:
boolean:Boolean。
boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。
byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为负数的问题),同时,byte当然可以直接提升到short型。
当对小于int的数据类型(byte, char, short)进行运算时,首先会把这些类型的变量值强制转为int类型进行计算,最后会得到int类型的值。因此,如果把2个short类型的值相加,最后得到的结果是int类型,如果需要得到short类型的结果,就必须显示地运算结果转为short类型。
1 //编译出错。正确的写法是:short s1 = 1;s1 = (short)(s1+1)
2 short s1 = 1;s1 = s1+1;
3 //编译通过
4 short s1 = 1;s1 += 1;
1.1自动类型转换
eg:double d = 1000;
自动类型转换
范围大的数据类型 变量 = 范围小的数据
自动类型转换,数据值的数学意义上的大小是不变的。
强制转换
范围小的数据类型 变量 = (范围小的数据类型)范围大的数据
eg:int i = (int)6.718
强制类型转换,数据值的数学意义上的大小会被改变。
**
1+‘1’+1+1+“0”,请问等于多少
我就开始从前面一个一个测试:
public class DateType {
public static void main(String[] args) {
System.out.println(1+'1');
}
}
控制台输出:50,那说明‘1’就表示49,在ascii码表里里面可以查到字符1对应的10进制ascii值为49,”0“表示在后面拼接一个字符0,这样就很容易知道结果了。
当我换了位置重新测试一下又发现了问题:
public class DateType {
public static void main(String[] args) {
System.out.println("1"+1+1);
}
}
public class DateType {
public static void main(String[] args) {
System.out.println("1"+1+'1');
}
}
控制台输出结果都是:111,先开始我也为第二结果为1149
说明第一个为字符时,后面不管什么类型都是字符,还有最后输出的结果的数据类型都是字符类型。
总结:不同的数据类型运算,从左往右计算,如果是整形,正常的10进制计算,遇到字符转成10进制的ascii码值计算,有字符就直接拼接字符,遇到字符的,后面都是字符,就没必要转化。
再看看下面
System.out.println(1.1 + 1);// 2.1
System.out.println(1 + 1.1);// 2.1
System.out.println(1 + 0.3);// 1.3
System.out.println(0.3 + 0.03);// 0.32999999999999996
System.out.println(1 + 0.3 + 0.33);// 1.6300000000000001
System.out.println(0.3 + 0.3);// 0.6
System.out.println(1 / 0.5 + 2);// 4.0
System.out.println(“9” + 1 / 0.5);// 92.0
System.out.println(“9” + 1 / 0.5 + 5);// 92.05
System.out.println(1 / 0.5 + 5 + “9”);// 7.09
System.out.println(1 / 0.3);// 3.3333333333333335
System.out.println(3 * 0.3);// 0.8999999999999999
System.out.println(3 * 0.4);// 1.2000000000000002
System.out.println(0.3 * 0.3);// 0.09
不难发现:
基本类型(除了boolean外)可以自动转换的,转换形式为:byte,short,char – int --long–float–double这就是自动转换的顺序了,其中byte,short,char在运算时是自动转换为int型的,而int与long运算时自动转换为long型。从上可知,float与double运算时是自动转换为double再进行计算的,int与float运算时先转换为float再运算。也就是说,表述范围小的可以自动转换为表述范围大的,(表述范围不是指类型的大小)其次,如果你要得到某一类型的数值时,也可以通过强制转换来实现
//数据转换的类型有两种,第一种是显式转换,第二种是隐式转换
//低精度类型的数据像高精度类型的数据转换的时候,永远不会溢出,并且总是成功的。
//高精度类型的数据向低精度类型的数据转换的时候,则必然会有信息丢失,有可能失败。
//从低级向高级类型的数据转换,系统会自动执行,这种类型为隐式转换。
//以下数据类型涉及到数据转换不包括字符类型和逻辑类型:这些类型精度由高到低是:byte,short,int,long,flaot,double
//把高精度的数据赋值给低精度变量的数据时,必须使用显式抓换。
//执行显式转换的时候,可能会导致精度损失,只要是boolean类型以外的数据类型都可以显式转换的方式达到