Java的原始整數類型(即byte,short,int和long)都是有符號的。但是你可以解決這個問題。
要做(說)32位無符號算術,只要做算術假裝'int'是無符號的。例如,2**31 - 1
是最大(有符號)int
值。如果你添加一個,你會得到-2**31
。但是,如果您認爲int
未簽名,那麼該位模式與+2**31
相同。這也適用於減法和乘法。 (我不確定分割和剩餘,但是這對你來說並不重要)。
比較無符號的32位值有點棘手。例如,-1
小於+1
,但如果您將-1
解釋爲無符號值,則會得到+2**32 - 1
,它應該大於'+1'。你可以通過翻譯不等式來彌補(我會留給讀者弄清楚)或者通過將int
的值轉換爲long
,用0xffffffffL
掩蓋它們,並將它們作爲長整數進行比較;例如
int u1 = ...
int u2 = ...
if ((((long) u1) & 0xffffffff) < (((long) u2) & 0xffffffff) {
// u1 represents a smaller unsigned value than u2
}
將32位無符號整數轉換爲字符串最簡單的做法是使用longs;例如
String str = Long.toString(((long) u1) & 0xffffffffL);
現在,我將自由地承認,使用int
來表示32比特的無符號值是棘手的,並有可能容易出錯。一個更清潔的解決方案將始終使用long
,或者如果您的應用程序需要64位無符號值來使用BigInteger
。
UPDATE - 它看起來的Java 8將支持(在庫法的形式),用於治療int
和long
爲無符號類型 - 見"Unsigned Integer Arithmetic API now in JDK 8"由約瑟夫·達西@甲骨文。
在Java所有整數類型(除焦)是籤。 – mob 2009-10-16 06:20:14
你使用什麼協議?如果你向服務器發送了某些東西,它的發送方式很重要,而不是你的內部表示。我想,你的問題聽起來應該是這樣的:「我如何使用corba/RMI/Hessian/t3/iiop/http/.....發送無符號數字?」 – 2009-10-16 06:47:04