高精度类型->低精度类型的强转可能丢失精度,因为它是把高精度的低位截取转换为低精度数值,由此也引出了一些问题,请看下面两个问题:
问题一:请解释下述代码的错误原因
代码一:可以得出预料结果:
运行结果:10
代码二:错误
运行结果:错误,可能丢失精度
错误原因:在代码二中b1与b2都是变量,无法进行类型边界数值得检测,所以无法确定是否在byte的取值范围内,故会报精度错误。
代码三:
运行结果:-2147483648
原因:默认int类型的整数相加还是int类型的整数,一旦超出边界就会截取低32位,所以二进制首位(最高位)变为1,即为负数
代码四:
运行结果:1234
原因:任何数据和字符串相加都是做连接操作。
代码五:
运行结果: 7
原因:这个之所以能正确运行,是因为+=这类运算符底层自动进行了类型转换,即先将s+4的运算结果转化为short再赋值给s,等价于s = (short)(s + 4);
如果这么写:short s = 3; s = s + 4; 运行错误,因为s不确定,是变量。