2010-08-02 58 views
5

我想了解如何將有符號數轉換爲無符號數。瞭解Java無符號數

可以說我有這樣的:

byte number = 127; // '1111111' 

爲了讓未簽名我必須選擇「做大」數據類型「短」和適用,運營商,值設爲0x00FF。

short number2; 
number2 = number & 0x00ff; 

爲什麼它使數字無符號?

回答

4

Java實際上並沒有未簽名的基元。

值127實際上表示爲'01111111',第一位是符號(0是正數)。

無符號字節可以保存值0到255,但127是有符號字節的最大值。由於一個字節有8位,並且有符號的一個消耗一個來保存符號。 所以,如果你想表示大於127的值,你需要使用一個更大的位數。更大的類型也有一個用於符號的保留位,但它至少有8位用於實際值,因此您可以表示值255.

也就是說,您應該避免使用字節和短,因爲在那裏是他們的問題。你會注意到我簡化了結果,因爲操作符實際返回int。你應該堅持int和長期在java中,因爲它們更好地實現。

編輯:AND運算符使其無符號,因爲符號位是短路的第一位,您將8位保留該字節的值複製到短路的最後8位。所以如果你有一個負數,那麼第一位是1(這意味着它是負數)實際上就成了數值的一部分。而且空頭始終是正的,因爲它的符號位在兩個冪的兩個高位受到短線的影響。

byte:    10101101 
        ||||||| <- actual value 
short:  0000000010101101 
      ||||||||||||||| <- actual value 

編輯2:注意到,雖然自從負值使用two's complement representation的值可能不是你希望它是什麼。所有的正面價值都保持不變。
但是-128 = 0x10000000的將成爲128
-127 = 0x10000001將成爲129
依此類推,直到-1 = 0x11111111這將成爲255

+0

有關字節和短的問題的任何鏈接?我每次都使用字節,但從來沒有真正用過短。 – 2010-08-02 13:49:05

+0

@DeanJ:我認爲問題是性能,因爲你需要更多的強制轉換,因爲許多操作返回int。 – Cloudanger 2010-08-02 13:52:55

+0

這裏的第一個例子演示了這一點:http://blog.mpathirage。com/2010/06/27/java-puzzlers-phantom-reference-menace-attack-of-the-the-clone-revenge-of-the-shift /如果你使用+或 - 這樣的簡短操作符,它實際上會轉換成一個int,這可能會導致調用重載方法時出現問題。 – 2010-08-02 13:55:49

1

java沒有未簽名的數據類型。您只需切換到「更大」的數據類型即可。

+0

我問這個和操作如何使它簽名 – shlomjmi 2010-08-02 13:34:21

+0

它不使它成爲無符號類型。移位魔法所能達到的最大效果就是減負。但是這並不會使它成爲無符號類型。無論如何,你如何看待這種情況?在JVM中,移位操作會意外創建新的子類或黑客? – foret 2010-08-02 13:47:25

0

如果你只是從一個負字節移動到int,那麼int也是負的。你採取負詮釋(或在你的例子中短),並設置最高3字節(整數)爲0x00。