我正在尝试实现现有的网络协议,该协议大量使用Java不支持的无符号数据类型。我目前所做的是针对每种数据类型,选择下一个较大的数据类型,以便无符号数可以适合正区域,然后使用字节移位来获得所需的效果。由于这非常容易出错,而且对于无符号的长时间向前,我必须使用比扩展类型重得多的BigInteger,我想知道是否有更好的方法来实现这一点?
答案 0 :(得分:16)
根据您的操作,您可以将long视为64位值,将int视为32位值。大多数操作esp readInt / Long writeInt / Long通过忽略符号来完成相同的操作。
您能举例说明您对这些数字执行的操作吗?也许我们可以建议如何在不扩展类型的情况下做同样的事情。
例如,++, - ,+, - ,*,==,!=,<<无论signess如何,所有工作都相同(即给出相同的答案)。 for>>你可以替换>>>
这是/,%,>,> =,<,< =和打印函数,它们假设有符号值,但您应该可以解决这些问题(如果您使用这些)。
e.g。
long unsignedA =
long unsignedB =
boolean greater = unsignedA + Long.MIN_VALUE > unsignedB + Long.MIN_VALUE
编辑:为什么这样做?部分原因是java没有溢出/下溢异常。
e.g。
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.