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