为什么两个短值的按位AND导致Java中的int值?

时间:2010-02-17 10:06:34

标签: java bit-manipulation

short permissions = 0755;
short requested = 0700;
short result = permissions & requested; 

我收到编译错误:

error possible loss of precision
found   : int
required: short

如果我没有完全错误,二进制AND的结果与最长的操作数一样长。为什么结果是整数?

如果我会投短,会不会有性能上升?

(short) permissions & requested

5 个答案:

答案 0 :(得分:6)

简短的回答(哈!)是binary numeric promotion

  
      
  • 如果任何操作数是引用类型,则执行拆箱转换(第5.1.8节)。然后:
  •   
  • 如果任一操作数的类型为double,则另一个操作数将转换为double。
  •   
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。
  •   
  • 否则,如果任一操作数的类型为long,则另一个操作数将转换为long。
  •   
  • 否则,两个操作数都将转换为int。
  •   

答案 1 :(得分:3)

  

如果我不是完全错误的结果   二进制AND和最长的一样长   操作数。为什么结果是整数?

因为Java语言规范说非长整数运算的结果总是int。它可能是这样写的,以确认32位CPU在内部工作就像这样 - 他们实际上没有方法用短路算术。

  

如果我会投短,会不会有性能上升?

由于上述原因:不 - 无论如何都必须发生。

答案 2 :(得分:2)

我只想补充一点,如果你使用算术赋值运算符,你实际上可以避免强制转换。它不是更快或更慢,只是可能很难知道的东西。

short permissions = 0755;
short requested = 0700;
short result = permissions;
result &= requested;

答案 3 :(得分:2)

实际上,我怀疑你可能会受到性能打击。在intlong值上只有用于按位运算的Java字节码。因此,shortpermission变量中的requested值需要(理论上)在执行操作之前进行符号扩展。

(此外,我认为您会发现原生的逐位指令仅在32位和64位中可用。或者如果有8位或16位版本,它们将采用与32位相同的时钟数版本.CPU数据路径的宽度至少为32位,对于和/或/ xor,无法使较窄的类型工作得更快。)

此外,即使三个变量具有类型short,JVM也会分配相同数量的字节来存储它们。这是JVM设计方式的结果。

因此,如果您使用short的目的是节省空间或时间,那么它可能无济于事。但唯一可以确定的方法是使用分析器来比较应用程序的shortint版本......或者更好的是,只需忘记它。

答案 4 :(得分:1)

&运算符的操作数将被提升为int,因此结果为int,如果要将其存储在result中,则必须将其转换为short。我不认为它应该是性能损失,除非编译器不能生成代码。

来自http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.22.1

  

当运算符&,^或|的两个操作数时是一种可转换(第5.1.8节)到基本整数类型的类型,首先对操作数执行二进制数字提升(第5.6.2节)。

来自http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#170983

  

[...]否则,两个操作数都将转换为int类型。