当前位置: 首页 > 知识库问答 >
问题:

为什么java xor按位运算符会导致整数而不是其操作数的类型?[复制]

印子平
2023-03-14

如果我编译这个:

 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;

这让我经历了一段短暂的旅程,我决定^总是在按位上下文中生成int。我不明白为什么会做出这样的选择。

起初我认为这可能与装箱(或拆箱)有关,但我使用的是一个基元类型,因此我不认为这是我困惑的一部分。

我能想到的唯一一件事是字节被提升为int,但我还没有找到任何证据表明发生了这种情况。

共有1个答案

锺离俊雄
2023-03-14

因为在Java中,所有数字运算符都将操作数提升为JLS 5.6.2定义的int、long、float或double。二进制数字升级:

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

>

加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:

>

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

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

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

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

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

>

数值类型-的加减运算符(§15.18.2)

数值比较运算符

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

整数位运算符<代码>

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

 类似资料:
  • 我的目标是了解两者的互补性。 有符号整数中的等于。但是,如果您使用十六进制的或十进制的按位与它,它将等于。 在我看来,这不应该发生,因为顶部字节与结果字节相同 我的预期结果是该值不应该改变,它等于< code>-121。 我的实际结果是值发生变化。 我的猜测是,是一个。因此,顶部字节的有符号位和下部字节的无符号位将导致无符号位。但是......那不可能是对的。

  • 请看下面的代码。我使用Apache Derby作为嵌入式数据库 此代码出现以下错误 在这里,我试图做的是,获取全名,它作为FirstName、MiddleName和LastName存储在数据库中。 示例:名字-彼得,中间名-梅塔,姓氏-约翰逊 然后我试着得到“彼得·梅塔·约翰逊”。这就是为什么我使用运算符将值合并到3列中。 为什么我得到这个错误?这在MSSQL Server中有效,但在Derby中

  • 问题内容: 我是一个仅出于乐趣而编写代码的人,并且在学术或专业环境中都没有真正地去研究它,所以像这些按位运算符之类的东西真的让我感到困惑。 我正在阅读一篇有关JavaScript的文章,该文章显然支持按位操作。我一直看到该操作在某些地方提到过,并且我尝试阅读以弄清楚它到底是什么,但是我似乎一点也不了解。那是什么 清楚的例子会很棒!:D 再问几个问题-按位运算的一些实际应用是什么?您什么时候可以使用

  • 问题内容: 我正在研究《 Beginning Android Games》 这本书。我注意到的一件事是: 这是我第一次看到这样的变量,所以我不知道它的作用。我在Java中运行代码并创建了一些示例。 如果我运行此代码: 答案将是0?这是为什么? 如果我运行此代码: 起初,我认为这是价值的串联,因此我假设i = 10500,但事实并非如此。答案是一样的。还是0?有人知道这里发生了什么吗? 问题答案:

  • 错误显示这一行 我已经修复了代码: 是括号的一个问题,以后可以更新。

  • 二进制运算符“*”的操作数类型不正确 我在编译过程中得到的错误是二进制运算符的操作数类型错误,它说:第一个类型:int,第二个类型:int[],我只能使用这个逻辑。以下是我的程序的一部分