DBMNG数据库管理与应用

书籍是全世界的营养品。生活里没有书籍,就好像没有阳光;智慧里没有书籍,就好像鸟儿没有翅膀。
当前位置:首页 > MySQL > 常见问题

表达式中的自动类型提升

3.10 表达式中的自动类型提升

除了赋值外,还有另外一个地方也可能会发生某些类型转换:在表达式中。为了分析其中的原因,考虑下面的情况。在表达式中,中间值要求的精度有时会超出操作数的范围。例如,检查下面的表达式:

 

中间部分a*b的结果很容易超出byte操作数的范围。为了解决这类问题,当对表达式求值时,Java自动将每个byte、short或char操作数提升为int类型。这意味着使用int类型而不是byte类型执行子表达式a*b。因此,尽管a和b都被指定为byte类型,中间表达式(50*40)的结果2000是合法的。

尽管自动类型提升很有用,但是它们会导致编译时混淆错误。例如,下面的代码看起来是正确的,但是会导致问题:

 

上面的代码试图将50*2——一个完全有效的byte值——保存在一个byte变量中。但是,当计算表达式的值时,操作数被自动提升为int类型,所以结果也被提升为int类型。因此,现在表达式的结果是int类型,如果不使用强制类型转换,就不能将结果赋给那个byte变量。尽管对于这个特定情况来说,所赋予的值仍然满足目标类型,但是仍然需要进行强制类型转换。

如果能理解溢出产生的后果,就应当使用显式的强制类型转换,如下所示:

 

这样就可以得到正确的值100。

类型提升规则

Java定义了几个应用于表达式的类型提升规则,如下所示:首先,正如刚才所描述的,所有byte、short和char类型的值都被提升为int类型。然后,如果有一个操作数是long类型,就将整个表达式提升为long类型;如果有一个操作数是float类型,就将整个表达式提升为float类型;如果任何一个操作数为double类型,结果将为double类型。

下面的程序演示了为了使第二个参数与每个二元运算符相匹配,如何提升表达式中的每个值:

 
下面进一步分析程序中如下这行代码中的类型提升:
  1. double result = (f * b) + (i / c) - (d * s); 
在第一个子表达式f*b中,b被提升为float类型,并且该子表达式的结果也是float类型。接下来在子表达式i/c中,c被提升为int类型,并且结果也是int类型。然后在d*s中,s的值被提升为double类型,并且该子表达式的类型为double。最后考虑三个中间值的类型——float、int和double。float加上int的结果是float。之后,作为结果的float减去最后的double,会被提升为double,这就是表达式最终结果的类型。
本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号