无符号 16 位和 64 位整数



如何在 Java 中生成 16 位无符号整数和 64 位无符号整数?这个问题与实施标准有关。我无法更改规格。

规范的其他可能相关的部分。 这个问题与:

  • 最高有效位必须为 0。
  • 必须以网络字节顺序表示。

应用程序上下文:数字(无论哪种形式(表示要发送的数据的长度。长度可大可小。我首先找到了要发送的消息的长度作为长度。

所以我从:long length = getLength();

然后,我需要将长变量"长度"转换为上述两个变量中的任何一个,具体取决于它的大小。最后,我很确定在发送长度时需要做一个.getBytes()。收件人将如上所述进行解释。

如果最高有效位必须为零,则无论它是有符号的还是无符号的,数字都是相同的(假设二进制的补码表示(。 例如,带有 MSB 零的 16 位整数表示从 032767(含(的数字。

假设您正在写入OutputStream并且您对"网络顺序"的定义首先是最重要的字节,那么您需要执行以下操作:

public void writeShort(OutputStream os, short s) throws IOException {
    os.write((byte) (s >> 8));
    os.write((byte) s);
}

public void writeLong(OutputStream os, long l) throws IOException {
    os.write((byte) (l >> 56));
    os.write((byte) (l >> 48));
    os.write((byte) (l >> 40));
    os.write((byte) (l >> 32));
    os.write((byte) (l >> 24));
    os.write((byte) (l >> 16));
    os.write((byte) (l >> 8));
    os.write((byte) l);
}

请注意,这些适用于有符号和无符号整数。 (或者更准确地说,对于 Java 上下文,如果参数表示有符号或无符号整数,它们就会起作用。

Java 没有无符号数据类型(参见此处:http://darksleep.com/player/JavaAndUnsignedTypes.html(

int 有 32 位,long 有 64 位,short 有 16 位

存储这么久有那么糟糕吗?

最新更新