发表于: 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不在其表数范围内,所以转换成了完全不同的值,无意义的值。


返回列表 返回列表
评论

    分享到