发表于: 2017-02-21 22:28:50
2 1922
今天完成的事情:
复习之前学习的基本数据类型的表数范围;
学习基本数据类型之间的自动转换、强制类型转换问题;
明天计划的事情:
学习类型提升问题;
巩固自动类型转换和强制类型转换;
学习JDK的一些特征,二进制整数,以及下划线分隔符的用法
遇到的问题:
1)为什么会显示三个错误?
错误一:(代码第6行)由于double类型的表数范围要比float类型的表数范围大,所以不能自动类型转换
错误二:(代码第8行)由于1.3这个浮点数值默认为double类型,double类型的表数范围超过float类型,所以不能自动转换
错误三:(代码第9行)由于float类型的表数范围比long类型的表述范围大,所以也不能自动类型转换
2)在强制类型转换中提到有可能造成精度降低或溢出,什么是精度降低?什么是精度溢出?
收获:
自动类型转换
1)容量小的数据类型可以自动转换为容量大的数据类型。(这里的容量不是指 字节数,而是指 表数的范围)
根据基本数据类型表数的范围可以得到自动转换的图示:
*黑色的实线表示无数据丢失的自动类型转换;红色的虚线表示在转换时可能会损失精度。
2)有一个形象的比喻来形容自动类型转换:
当一个小的容器的水换到一个大的容器中毫无问题,但是一个大的容器的水换成小的容器则会装不下,就会溢出。
3)特例: 可以将整型常量直接赋值给byte,short,char等类型变量,而不需要进行强制类型转换,但是有一个前提条件:数值不超过该类型变量的表数范围
例1:下图中由于byte类型变量的表数范围是-128到127,所以第4行和第6行代码在编译时没有遇到问题,然而,第5行的int数值128和第7行的int数值-129都超过了byte变量的表数范围,所以报错显示:
不兼容的类型:从int转换到byte可能有损失
例2:下图中由于char类型变量的表数范围是0到65535,所以第6行和第7行代码在编译时没有遇到问题,然而,第5行的int数值-3和第8行的int数值65536都超过了char变量的表数范围,所以报错显示:
不兼容类型:从int转换到char可能会有损失
强制类型转换
1)强制类型转换,又被称为造型,用于显示的转换一个数值的类型。在有可能丢失信息的情况下进行转换是通过造型来完成的,但可能造成精度降低或溢出。
例1:下图中int类型的表数范围超出char类型,导致不兼容。所以要在i前面加(char)来强制类型转化。
经过强制转型的int变量i, 将数值100直接赋值给char变量,系统打印出了ASCII码表中十进制100所对应的小写字母d。
例2:下图中double类型的表数范围超出了int类型的表数范围,所以强制转型为(int)
例3:下图中,char类型变量c被赋值'a',运算时直接当作整数97来运算,所以整数d的值为98;通过(char)强制类型转换,根据ASCII码表中的98又转换为了对应的小写字母b
2)当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。
例1
通过举了这些例子,感觉规律是:byte变量bx的值只能在-128到127这一区间,所以如果给一个int变量赋值,比如说 int x6 = 960, 可以用960减去多个256,知道最后的差值进入[-128,127]的范围,最后的差就是bx6打印出来的数值。即960-256=704,704-256=448,448-256=192,192-256=-64 此时,-64正好在该范围内,所以输出值我猜测为-64.
例2
char类型的表数范围是0到65535,而-105不在其表数范围内,所以转换成了完全不同的值,无意义的值。
评论