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

如果在移位运算符中使用强制转换运算符怎么办

牟嘉
2023-03-14

JLS说

编辑:如果操作数已经使用转换运算符转换为不同的(较小的)类型,那么操作数是否经历数字提升(一元/二进制)?如果是这种情况,您将如何解释具有字节变量b1=(byte)(b2+b3)表达式,因为在强制转换之后,字节结果可能会根据数字提升转换为int?

共有1个答案

洪河
2023-03-14

Java8 JLS还在§5.6.1中声明:

5.6.1.一元数字提升

某些运算符对单个操作数应用一元数值提升,该操作数必须产生数值类型的值:

    null
int i = ...
short s = (short) i << 2;
Main.java:4: error: incompatible types: possible lossy conversion from int to short
short s = (short) i << 2;

IdeOne演示

这是由于强制转换绑定到移位的第一个参数,而不是整个表达式。下面是带有显式括号的整个表达式:

short s = ((byte) i) << 2;

鉴于

int i = ...;
int j = (short) i << 2;

5.6.数字上下文

数值上下文适用于算术运算符的操作数、数组创建和访问表达式、条件表达式以及开关表达式的结果表达式。

如果表达式是以下内容之一,则该表达式将出现在数值算术上下文中:

    null

接下来,根据以下规则,将加宽基元转换(§5.1.2)和缩小基元转换(§5.1.3)应用于某些表达式:

...

>

  • 否则,表达式都不属于doublefloatlong类型。在这种情况下,上下文的种类决定如何选择提升的类型。

    • 否则,提升的类型是int,所有不属于int类型的表达式都要进行加宽基元转换,转换为int.

    ...

  •  类似资料:
    • C++ 运算符 强制转换运算符是一种特殊的运算符,它把一种数据类型转换为另一种数据类型。强制转换运算符是一元运算符,它的优先级与其他一元运算符相同。 大多数的 C++ 编译器都支持大部分通用的强制转换运算符: (type) expression 其中,type 是转换后的数据类型。下面列出了 C++ 支持的其他几种强制转换运算符: const_cast<type> (expr): const

    • 问题内容: 我正在尝试调试Java中涉及ClassCastException的问题。为了解决该问题,我需要知道从Object转换为特定类型时发生了什么。 谁能向我解释Java Cast操作符如何在Java级别和JVM级别工作? 问题答案: JLS是否足够好? 强制转换将应用于强制转换操作符的操作数(第15.16节):操作数表达式的类型必须转换为强制转换操作符显式命名的类型。铸造上下文允许使用: 身

    • 问题内容: 我很难理解一些代码,这些代码显示了一个示例,该示例如何将Java中的double转换为byte [],反之亦然。 这是用于将双精度型转换为byte []的代码: 这是用于将byte []转换为double的代码: 好的,这是我不太了解的部分。 似乎强制转换发生在实际的按位运算之前,因为作者说 该表达式将把字节放在长[…]处,然后应用mask删除java施加的符号 在实际转换之前,如何将

    • 假设: 2的补码形式的32位有符号整数 true和false是值为1和0的整数 java运算符 你能实现像<代码>

    • 基本上,我希望我的范围类型可以从

    • 问题内容: 我正在尝试了解轮班经营者,但收获不多。当我尝试执行以下代码时 我得到以下 有人可以解释一下吗? 问题答案: 将二进制2()向左移动11次。因此:1000000000000 将二进制2()向左移动22次。因此: 现在,int为4字节,因此为32位。因此,当你偏移33时,它等效于偏移1。因此:100