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

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

我收到编译器错误:

 error possible loss of precision found : int required: short 

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

如果我能做空,会不会有性能损失?

 (short) permissions & requested 

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

因为Java语言规范说非长整数运算的结果总是int。 这可能是为了确认32位CPU在内部工作的原因 – 他们实际上没有办法用短路进行算术运算。

如果我能做空,会不会有性能损失?

由于上面给出的原因:不 – 无论如何都必须发生。

简短的回答(哈!)是二进制数字促销 。

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

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

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

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

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

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

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

&运算符的操作数将被提升为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类型。