java中的unsigned short

mai*_*iky 56 java unsigned types short

如何unsigned short在Java中声明值?

Jon*_*eet 66

你不能,真的.除了以外,Java没有任何无符号数据类型char.

不可否认,你可以使用char- 它是一个16位无符号类型 - 但在我看来这很可怕,因为char显然是用于文本:当代码使用时char,我希望它用于表示文本的UTF-16代码单元这对程序很有意思,而不是与文本无关的任意无符号16位整数.

  • @Jon:在Java中似乎没有办法获得正常的机器级字节,这意味着一个8位的位置可以保存值[0-255]而不是[-128 - +127].我不敢相信他们让我们使用**签名字节**,当你在C中所做的只是说`unsigned char`时.一旦开始使用已签名的数据类型,它就会搞砸所有未签名的位图.真的很不愉快.Java设计人员认为他们正在简化事情以减少错误,但他们所做的一切就是让它们变得比以前更难,更容易出错.Java中有很多这样的东西. (20认同)
  • @ninjalj,哦*哪里*你是`typedef`? (6认同)
  • @tchrist - 很好FWIW暗示"机器级别"字节是0-255而不是-128- + 127并不准确.机器字节只是 - 8位,并且值的解释可能取决于所使用的指令.在许多情况下,您是否将一个字节视为有符号或无符号实际上对组件没有任何影响(例如,加法,减法,一些乘法,所有位操作).对于大多数位图使用,签名解释无关紧要 - 所有按位运算符都按预期运行.它只是你需要注意转换的真正标志扩展. (4认同)
  • @AleksandrDubinsky:你是多么被动 - 好斗.我想我们已经在这里完成了.如果有人想关注您的链接,他们可以在那里看到其他答案的内容. (3认同)
  • @Jon:OTOH,因为Java的`char`无法用于Unicode代码点,你也可以将它用于unsigned short:当它们确实应该使用`int时,它不会比使用`char`的任何现有代码更可怕`. (2认同)
  • @AleksandrDubinsky:“char”作为类型没有任何问题 - 但使用它 * 作为无符号 16 位整数而不是文本 * 是对该类型的滥用,IMO。当我在代码中看到“char”时,我想到的是“UTF-16代码单元”,而不是“任意16位整数”。 (2认同)
  • @AleksandrDubinsky:我已经将我的推理添加到了答案中,但是在那里保持“可怕”,因为我认为它“非常”可怕。我不会在将近8年的答案中开始重复其他答案的内容。 (2认同)

sta*_*lue 14

如果你真的需要一个16位的值:

解决方案1:使用可用的签名短文并停止担心该符号,除非您需要进行比较(<,<=,>,> =)或除法(/,%,>>)操作.请参阅此答案,了解如何处理已签名的数字,就像它们是未签名的一样.

解决方案2(解决方案1不适用):使用int的低16位,并在必要时使用&0xffff删除高位.


小智 12

这是一个非常陈旧的线程,但为了后来的任何人的利益.char是数字类型.它支持所有数学运算符,位操作等.它是无符号16.

我们处理由定制嵌入式硬件记录的信号,因此我们处理来自A-D的大量无符号16.我们多年来一直在使用这些地方的字符,从来没有遇到任何问题.


Tof*_*eer 10

你可以使用一个char,因为它是一个无符号的16位值(虽然从技术上来说它是一个unicode字符,因此将来可以改为24位值)...另一种选择是使用int并确保它在范围内.

不要使用char - 使用int :-)

这里有一个讨论Java和缺乏未签名链接.

  • char被定义为16位,而不是Unicode字符(无论这意味着什么),永远和永远.如果char更改为24位,则它将不再是Java. (3认同)

mob*_*ion 5

来自 DataInputStream.java

public final int readUnsignedShort() throws IOException {
    int ch1 = in.read();
    int ch2 = in.read();
    if ((ch1 | ch2) < 0)
        throw new EOFException();
    return (ch1 << 8) + (ch2 << 0);
}
Run Code Online (Sandbox Code Playgroud)