【问题标题】:Java : Operators and TypecastingJava:运算符和类型转换
【发布时间】:2014-10-01 02:22:03
【问题描述】:
long value = 0x88888888 ;
int i = (int) (value & 0xff);

上述表达式的求值是如何进行的?是吗

int i = (int)value & (int)0xff ;

还是先计算按位和运算?我很困惑:-|

【问题讨论】:

  • () 中的任何内容都会在应用外部的任何内容之前进行评估。标准规则是扩展较短的操作数以匹配较长的操作数。
  • 但这有关系吗?无论哪种方式i = 0x88
  • 这就是我的理解。但我有点困惑。谢谢!
  • 是的,如果值是
  • @sk89 我认为它与按位运算符(&|^~)没有什么不同,因为高阶位的内容永远不会影响低位发生的事情,反之亦然。

标签: java operators bit-manipulation bitwise-operators typecast-operator


【解决方案1】:

我们来看看bytecode

 public static void main(java.lang.String[]);
    Code:
    0: ldc2_w        #35                 // long -2004318072l
    3: lstore_1
    4: lload_1
    5: ldc2_w        #37                 // long 255l
    8: land
    9: l2i
   10: istore_3
   11: return
}

如您所见,十六进制 0xff 首先转换为 long,然后将 bitwise and 用于 ,在转换为 @987654326 之后用 0xff 屏蔽它@

  • lload_1 从局部变量 1 中加载 long 值

  • ldc2_w 将常量#index 从常量池(double 或 long)压入堆栈

  • land 按位和两个长整数
  • l2i 将 long 转换为 int

【讨论】:

    【解决方案2】:

    首先,按位运算被评估为对 long 的运算(括号保证它)。然后将结果转换为 int。

    【讨论】:

    • 谢谢!搞糊涂了!
    【解决方案3】:

    第一个(value & 0xff); 将被解决。即value(bitwise and)0xff. 然后将使用类型转换int i = (int) (value & 0xff); 将结果转换为 int 值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      相关资源
      最近更新 更多