2011-12-01 76 views

回答

8

Java字節碼規範僅defines signed types

積分類型字節,短,int和長,其值 8位,16位,32位和64位有符號的二進制補碼整數

而是語言在JVM之上實現也許可以在句法層面增加一個無符號的類型,只是在處理編譯階段的轉換。

+0

我從來沒有想過看字節碼規範。我應該。我只看了Java語言規範和各種Scala文檔。 –

+0

「內置的整型運算符不會以任何方式指示(正值或負值)溢出;它們將溢出迴繞。」這也表明,如果你正確處理這些情況,你確實可以使用標準的算術運算符來實現無符號數據類型。 –

+0

早在我曾經使用過QuckTime Java api的時候,它只是一個圍繞本地QuickTime庫的包裝,如果我的內存能夠爲我提供服務,那麼它就是充滿了未被整理的整數類型。這有點尷尬api明智的,但簽署,無符號轉換工作正常。 –

2

處理無符號算術是一種語言/實現問題,而不是平臺 - 即使沒有本地支持,它也可以在任何平臺上模擬。

JVM沒有它作爲一個類型,所以Java/Scala /等。不支持「開箱即用」。

3

雖然未簽名的類型可能在字節碼級進行模擬也有一些缺點與:

  • 性能:你會需要幾個字節碼操作爲每個簡單的算術運算。使用模擬無符號類型的代碼的性能比使用帶符號類型的代碼差兩到三倍。

  • 兼容性:運行在JVM上的大多數語言都很難與大量的Java代碼兼容。當引入其他類型時,或者當某些「已知」類型的變量必須以不同方式處理時,這當然會立即被破壞。

鑑於此,無符號類型的好處是恕我直言可以忽略不計。

+0

加號和減號的大小數字不會受到影響。比較可能是最大的麻煩。 – supercat

+0

@supercat:你爲什麼這麼認爲? –

+1

我能想到的唯一操作將會受到影響,那就是劃分,比較和轉換爲「長」或浮點類型。其中,比較將比其他比較頻繁地使用,並且通常佔用最少的時間。 – supercat