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

最佳答案

根据您的工作,您可以将long视为64位值,将int视为32位值。大多数操作(尤其是readInt/Long writeInt/Long)都通过忽略符号来实现相同的功能。

您能否举例说明您对这些数字执行的操作,也许我们可以建议如何在不扩展类型的情况下执行相同的操作。

例如,++,-,+,-,*,==,!=,<>您可以替代>>>

/,%,>,> =,
例如

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

编辑:为什么这样做?部分原因是Java没有上溢/下溢异常。

例如
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.

10-08 13:36