short permissions = 0755;
short requested = 0700;
short result = permissions & requested;
我收到编译错误:
error possible loss of precision
found : int
required: short
如果我没有完全错误,二进制AND的结果与最长的操作数一样长。为什么结果是整数?
如果我会投短,会不会有性能上升?
(short) permissions & requested
答案 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)
实际上,我怀疑你可能会受到性能打击。在int
和long
值上只有用于按位运算的Java字节码。因此,short
和permission
变量中的requested
值需要(理论上)在执行操作之前进行符号扩展。
(此外,我认为您会发现原生的逐位指令仅在32位和64位中可用。或者如果有8位或16位版本,它们将采用与32位相同的时钟数版本.CPU数据路径的宽度至少为32位,对于和/或/ xor,无法使较窄的类型工作得更快。)
此外,即使三个变量具有类型short
,JVM也会分配相同数量的字节来存储它们。这是JVM设计方式的结果。
因此,如果您使用short
的目的是节省空间或时间,那么它可能无济于事。但唯一可以确定的方法是使用分析器来比较应用程序的short
和int
版本......或者更好的是,只需忘记它。
答案 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类型。