数值类型的转换

最近在找工作的时候,经常碰到一些数值类型转换的笔试题,也想好好整理一下java的知识点,首先上一张图:

 这个箭头表示可以自动转换类型的路线图,他们之间可以越级自动转换,例如char类型可以直接转为double类型。

另外需要注意,char与byte、short是属于不同的分支,也就是说byte和short类型不能和char相互转换。

 当以上两个不同类型的数值进行二元操作的时候,java会先将两个操作数转换为同一种类型再进行计算。例如有一个数是int类型,有个数为其他类型。

上面是自动类型转换,现在我们讲讲强制类型转换,例如double类型转换为int类型的时候,java是直接通过截取整数部分,而忽略小数部分,这样会导致信息丢失。例如:

当然了,我们在这里可以对浮点数进行四舍五入,以便得到最接近的整数,但是要注意的是,四舍五入后的值是long类型,如果要转换为int类型的话,需要进行强制类型转换。

既然讲到了浮点数,那我们来说说strictfp这个关键字,我这里直接引用java核心技术卷上的内容,不过貌似这个关键字很少用。

可移植性是java语言的设计目标之一,无论在哪个虚拟机上运行,同一运算符应该得到同样的结果。对于浮点数的算术运算,实现这样的可移植性是相当困难的,double类型使用64位存储一个数值,而有些处理器使用80位浮点寄存器,这些寄存器增加了中间过程的计算精度。例如,以下运算:

double w=x*y/z;

很多Intel处理器计算x*y,并且将结果存储在80位的寄存器中,再除以z并将结果截断为64位。这样可以得到一个更加精准的计算结果,并且还能够避免产生指数溢出。但是,这个结果可能与始终在64位机器上计算的结果不一样。因此,java虚拟机的最初规范规定所有的中间计算都必须进行阶段。这种行为遭到了数值计算团队的反对。截断计算不仅可能导致溢出,而且由于截断操作需要消耗时间,所以在计算速度上实际上要比精确计算慢。为此,java程序设计语言承认了最优性能与理想结果之间存在的冲突,并给与了改进,在默认情况下,虚拟机设计者允许对中间计算结果采用扩展的精度,但是,对于使用strictfp关键字标记的方法必须使用严格的浮点计算来生成可再生的结果。例如,可以把main方法标记为:

public static strictfp void main(String[] args)

于是,在main方法中的所有指令都将使用严格的浮点计算,如果将一个类标记为strictfp,这个类中的所有方法都要使用严格的浮点计算。

实际的计算方式都取决于Intel处理器的行为,在默认的情况下,中间结果允许使用扩展的指数,但不允许使用扩展的尾数。因此,这两种方式的区别仅仅在于采用默认的方式不会参数溢出,而用严格的计算有可能产生溢出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值