Java中的Unsigned Int

我正在尝试实现现有的网络协议,该协议大量使用Java不支持的无符号数据类型。 我目前所做的是针对每种数据类型,选择下一个更大的数据类型,以便无符号数可以适合正区域,然后使用字节移位来获得所需的效果。 由于这非常容易出错,而且对于无符号长时间使用,我必须使用比扩展类型重得多的BigInteger,我想知道是否有更好的方法来实现这一点?

根据您的操作,您可以将long视为64位值,将int视为32位值。 大多数操作esp readInt / Long writeInt / Long通过忽略符号来工作。

你能给出一个你对这些数字进行操作的例子,也许我们可以建议如何在不扩展类型的情况下做同样的事情。

例如,++, – ,+, – ,*,==,!=,<<无论signess(即给出相同的答案),所有工作都相同。 for >>你可以替换>>>

它是/,%,>,> =,<,<=和打印函数,它们假设有符号值,但您应该可以解决这些问题(如果您使用这些)。

例如

long unsignedA = long unsignedB = boolean greater = unsignedA + Long.MIN_VALUE > unsignedB + Long.MIN_VALUE 

编辑:为什么这个工作? 部分原因是java没有溢出/下溢exception。

例如

 byte unsignedA = 0; unsignedA--; // unsignedA == FF, is this -1 or 255? Java assumes the former but you assume the later byte unsignedB = unsignedA * unsignedA; // unsignedB is -1 * -1 = 1 or (byte) (255*255) = (byte) 65525 = 1.