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