发表于: 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
在这里,下划线的功能是为了方便数清楚位数, 起到分隔符的作用。
评论