簡體   English   中英

為什么兩個短值的按位與會導致 Java 中的 int 值?

[英]Why does bitwise AND of two short values result in an int value in Java?

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

我收到編譯器錯誤:

error possible loss of precision
found   : int
required: short

如果我沒有完全錯,二進制 AND 的結果與最長的操作數一樣長。 為什么結果是整數?

如果我選擇做空,會不會影響性能?

(short) permissions & requested

簡短的回答(哈!)是, 二進制數字提升

  • 如果任何操作數是引用類型,則執行拆箱轉換(第 5.1.8 節)。 然后:
  • 如果任一操作數的類型為 double,則另一個將轉換為 double。
  • 否則,如果任一操作數的類型為 float,則另一個將轉換為 float。
  • 否則,如果任一操作數的類型為 long,則另一個將轉換為 long。
  • 否則,兩個操作數都被轉換為 int 類型。

如果我沒有完全錯,二進制 AND 的結果與最長的操作數一樣長。 為什么結果是整數?

因為 Java 語言規范說非長整數運算的結果總是一個 int。 它可能寫在的事實,32位CPU一樣,內部的工作無論如何確認的方式-他們居然沒有辦法做算術搭配短褲。

如果我選擇做空,會不會影響性能?

由於上述原因:不-無論如何都必須發生。

我只想補充一點,如果您使用算術賦值運算符,您實際上可以避免強制轉換。 它不是更快或更慢,只是一些可能很高興知道的東西。

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

實際上,我懷疑您的性能可能會受到影響。 對於intlong值的按位運算只有 Java 字節碼。 因此,在執行操作之前,需要(理論上)對permissionrequested變量中的short值進行符號擴展。

(此外,我認為您會發現原生按位指令僅適用於 32 位和 64 位。或者如果有 8 位或 16 位版本,它們將采用與 32 位版本相同數量的時鍾。 CPU 數據路徑將至少為 32 位寬,並且 for and/or/xor 沒有辦法使更窄的類型工作得更快。)

此外,即使這三個變量的類型為short ,JVM 也會分配相同數量的字節來存儲它們。 這是 JVM 設計方式的結果。

因此,如果您使用short的目的是節省空間或時間,那么它可能無濟於事。 但唯一可以確定的方法是使用分析器來比較應用程序的shortint版本......或者更好的是,忘記它。

&運算符的操作數將被提升為 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 類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM