Java 中的 Unsigned Int

2022-09-04 20:44:41

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


答案 1

根据您正在执行的操作,您可以将 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.

答案 2