八大基本类型
整型:byte short int long
浮点型:float double
字符型:char
布尔型:boolean
1. 自动类型提升:
当容量小的数据类型变量和容量大的数据类型变量做运算时,自动提升为容量大的数据类型(容量指表示数的范围大小)
byte、char、short --> int --> long --> float --> double
当byte、char、short做运算时,结果为int类型
2.强制类型转换:
double d1 = 10.3;
int i1 = (int) d1;//截断
System.out.println(i1);
需要使用强转符:()
可能导致精度损失
定义一个long型的值,后边加一个l显式的定义,否则会被认为是int型,此时若赋值超过int的范围,则会报错;
同理,定义float类型常量时,也要在末尾加一个f;
原因是,直接定义小数和整数常量时,会默认认为他们为double和int类型;
强制转换的精度损失
1.浮点数转换为整型情况下:
double d1 = 10.3;
int i1 = (int) d1;//截断
System.out.println(i1);
输出结果为:i1= 10
2.整型向更小的类型转换
例如,byte为1位字节,即8位二进制数,取值范围为-128~127
给一个byte赋值为130,并强制类型转换输出结果?
byte s1 = (byte)128;
byte s2 = (byte)130;
System.out.println("s1= "+s1);
System.out.println("s2= "+s2);
结果为:
s1= -128 s2= -126
知识补充
计算机中,存储数字是存储数字的补码,概念如下:
补码=反码+1;
而反码=原码所有位上的数字取反;
*且对于一个正数,其原码,反码和补码一致;
*二进制的正负通过首位符号位表示,0表示正数,1表示负数;
所以对于byte下的正127,且二进制为0111_1111;第一位为符号位,其余7位为数值大小的有效位,这就解释了为什么范围为-128~127
原因是,其二进制表示下,范围为:1000_0000~0111_1111;
原理解释
对于130,其二进制表示为0_1000_0010,在计算中储存的是其补码,由于130是正数,实际上存储的也是0_1000_0010;
当将其强制类型转换为byte时,由于byte只有8位,会进行截取,所以存储的是1000_0010,首位1表示负数;
所以其反码为,1000_0010-1=1000_0001;
其原码为:1111_1110,即为-126
-->所以byte s2 = (byte)130--->输出结果为-126