发表于: 2017-02-22 23:01:04

2 1818


今天完成的事情:

学习类型提升问题;

了解两个关于JDK的新增特性


明天计划的事情:

学习变量、成员变量和局部变量、常量以及命名规范


遇到的问题:

1)为什么第7行代码会发生报错?

答案:第7行代码的报错是因为变量a和b在进行加法运算的时候发生了类型提升。变量a为int类型,变量b为long类型,当他们进行加法运算时,a+b会自动提升为long类型

为了使变量c的输出值为8,可提供一下两种方法:



收获:

1)做所有关于二元运算符(+,-,*,/,%)的运算,都会有类型提升的问题

由于类型提升的问题,所以该强制转型的时候一定要记得强制转化,避免损失精度


2)强制转型结合类型提升可以解决如下问题:

问题1


输出值是负数肯定是出错了,发现total的值应该是300亿,明显超出了int类型的表数范围(正负约21亿)。所以试着将第7行的int换long,会是怎样?

输出值仍然是负数,因为money*years默认为int类型,所以一旦300亿超过int类型的表数范围,money*years已经表示着这个负数了,所以赋值给long类型的total变量的值仍然是负数。

所以,应该先将money或years中的其中一个变量强制转换为long类型,再进行二元运算的乘法运算时就会实现类型提升,正好赋值给long类型的变量,结果300亿没有超过long类型的表数范围,可以正常显示。


问题2

输出值为负数,是因为75*60*24*365*70=2575440000,超过了int类型的表数范围。所以应该强制类型转换为long类型,结合类型提升实现正确输出。

图中70L 表示将int类型的70强制转换为long类型,而且建议强制转换的数要靠前,避免出现因放到最后而导致前面的乘积已超出int类型的范围。例如:7000*60*24*365*70L, 前面的乘积已超出int类型的表数范围就会显示负值。


3)JDK新增的特性

二进制整数 为了方便对应、方便进行移位操作,编程时可以直接书写二进制数。书写时,注意以0b开头,int类型为4字节,即32位,所以int a = 13, 可以用二进制数表示为:

int a = 0b0000_0000_0000_0000_0000_0000_0000_1101

在这里,下划线的功能是为了方便数清楚位数, 起到分隔符的作用。


返回列表 返回列表
评论

    分享到