java - Java 中的无符号整型

标签 java networking protocols unsigned

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

最佳答案

根据您的操作,您可以将 long 视为 64 位值,将 int 视为 32 位值。大多数操作 esp 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.

关于java - Java 中的无符号整型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4449100/

相关文章:

java - 在 Spring 中解析 HTML 页面的问题 - Java

java - 将字符串数组解析为 ArrayList<Integer> 时丢失前导零

java - 为什么Splitter在Spring Integration中处理集合的项目时直接返回集合?

networking - 从网络中的另一台机器 Ping Docker Container

java - 如何在android中检索json数组?

android - 是否可以为连接到同一 wifi 的人创建聊天应用程序?

python - Python 中的 ICMP pinger 应用程序 - 错误 : operation not permitted?

ruby - 使用 Ruby 创建二进制数据?

ios - 协议(protocol)一致性的快速访问控制

arrays - 向下转换多个协议(protocol) Array<protocol<P1, P2>> 到 Array<P1>