【问题标题】:Java Basic Operator Return Type [duplicate]Java基本运算符返回类型[重复]
【发布时间】:2020-07-24 02:31:31
【问题描述】:

Java 运算符是否返回 int 类型?

short a = 1;
short b = 2;

short c = a&b;
short d = a+b;
long e = a&b;

如果是“c”、“d”,它们会出现类型不匹配错误。为什么? 'e' 的情况下没有错误。为什么??

【问题讨论】:

  • SO 中已经有几个问题和答案可以回答这个特定问题。例如,thisthis、...

标签: java


【解决方案1】:

您看到的是二进制数字提升。这是在 Java 语言规范§5.6.2 中指定的:

当一个运算符将二进制数字提升应用于一对 操作数,每个操作数必须表示一个可转换为 数字类型,按顺序适用以下规则:

  1. 如果任何操作数属于引用类型,则将对其进行拆箱转换(第 5.1.8 节)。

  2. 加宽原语转换(第 5.1.2 节)适用于转换以下规则中指定的一个或两个操作数:

    • 如果任一操作数是 double 类型,则另一个将转换为 double。

    • 否则,如果任一操作数为浮点型,则将另一个转换为浮点型。

    • 否则,如果任一操作数为 long 类型,则将另一个转换为 long。

    • 否则,两个操作数都转换为 int 类型。

然后继续列出适用的运算符,我不会在这里引用。

在所有情况下,两个操作数都是short,因此根据最后一个项目符号,它们都转换为int。一个int 加上一个int 是另一个int,它不能隐式转换为short。因此cd 中的错误。不过,int 可以隐式转换为long,因此e 不会出错。

【讨论】:

    【解决方案2】:

    两个小于 int 的整数类型变量之间的任何运算都会产生 int。所以:

    short + short -> int
    short + byte -> int
    

    等等。 Java Language Specification中提到过。

    因此,您必须将 a + b 的结果转换为 short 以便将其分配回 short 类型的变量。请注意,这样做可能会丢失数据。

    但是long 大于int。分配是有效的。

    【讨论】:

      猜你喜欢
      • 2018-04-12
      • 2015-01-29
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 2012-04-26
      • 2012-07-07
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多