为什么两个短值的按位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;
实际上,我怀疑你可能会受到性能打击。 对于int
和long
值,只有Java字节码用于按位运算。 因此,在执行操作之前, permission
和requested
变量中的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类型。