我想了解如何將有符號數轉換爲無符號數。瞭解Java無符號數
可以說我有這樣的:
byte number = 127; // '1111111'
爲了讓未簽名我必須選擇「做大」數據類型「短」和適用,運營商,值設爲0x00FF。
short number2;
number2 = number & 0x00ff;
爲什麼它使數字無符號?
我想了解如何將有符號數轉換爲無符號數。瞭解Java無符號數
可以說我有這樣的:
byte number = 127; // '1111111'
爲了讓未簽名我必須選擇「做大」數據類型「短」和適用,運營商,值設爲0x00FF。
short number2;
number2 = number & 0x00ff;
爲什麼它使數字無符號?
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
如果你只是從一個負字節移動到int,那麼int也是負的。你採取負詮釋(或在你的例子中短),並設置最高3字節(整數)爲0x00。
有關字節和短的問題的任何鏈接?我每次都使用字節,但從來沒有真正用過短。 – 2010-08-02 13:49:05
@DeanJ:我認爲問題是性能,因爲你需要更多的強制轉換,因爲許多操作返回int。 – Cloudanger 2010-08-02 13:52:55
這裏的第一個例子演示了這一點: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