八大基本类型

整型: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