【问题标题】:Why does the java xor bitwise operator result in integer instead of the type of its operands? [duplicate]为什么 java xor 按位运算符的结果是整数而不是其操作数的类型? [复制]
【发布时间】:2018-10-08 16:01:32
【问题描述】:

如果我编译这个:

 1      public class test {
 2          public static void main (String args[]) {
 3              byte bx = 1;
 4              byte by = 2;
 5
 6              int iz = bx ^ by;
 7              byte bz = bx ^ by;
 8              byte cbz = (byte)(bx ^ by);
 9          }
10      }

然后我得到这个错误:

test.java:7: error: incompatible types: possible lossy conversion from int to byte
                bz = bx ^ by;

这使我得到了一个简短的journey 导致我决定 ^ 在按位上下文中总是导致int。我不明白为什么会做出这样的选择。

起初我认为这可能与装箱(或拆箱)有关,但我使用的是原始类型,所以我不认为这是我困惑的一部分。

我唯一能想到的是将 byte 提升为 int,但我还没有找到任何说明会发生这种情况的信息。

【问题讨论】:

  • This 表示“二进制数字提升首先在操作数上执行”。在指向 here 的链接之后说:“否则,两个操作数都将转换为 int 类型。”
  • 这些并不是真正的重复,因为他们没有说“为什么”促销发生。我猜这是因为他们不必编写相同代码的 16 个不同版本来防止开发人员不得不进行看似不必要的转换。
  • @jeff6times7 answer in second link 确实试图解释更深层次的为什么,而不仅仅是下面的my answer,它基本上说:因为他们就是这样写的它在规范中

标签: java


【解决方案1】:

因为在 Java 中,所有数字运算符都会将操作数提升为 intlongfloatdouble,如 JLS 5.6.2. Binary Numeric Promotion 所定义:

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

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

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

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

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

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

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

类型转换后,如果有的话,值集转换(第 5.1.13 节)将应用于每个操作数。

对某些运算符的操作数执行二进制数字提升:

  • 乘法运算符 */%(第 15.17 节)

  • 数字类型+- 的加法和减法运算符(第15.18.2 节)

  • 数值比较运算符 <<=>>=(第 15.20.1 节)

  • 数值相等运算符 ==!= (§15.21.1)

  • 整数位运算符 &^|(第 15.22.1 节)

  • 在某些情况下,条件运算符 ? : (§15.25)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2019-02-21
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多