无符号16位和64位整数

时间:2011-09-05 10:35:32

标签: java type-conversion java-7 network-protocols primitive-types

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

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

有关
  • 最重要的位必须为0。
  • 必须以网络字节顺序表示。

应用程序上下文:数字(以任一形式)表示要发送的数据的长度。长度可以大或小。我第一次发现要发送的消息长度很长。

所以我开始:long length = getLength();

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

2 个答案:

答案 0 :(得分:6)

如果最高有效位必须为零,那么无论是有符号还是无符号,数字都是相同的(假设是二进制补码表示)。因此,例如,具有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上下文,如果参数表示有符号或无符号整数,它们就可以工作。)

答案 1 :(得分:1)

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

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

将所有内容存储得如此之长是如此糟糕?