Java中的无符号short

Java中的无符号short,java,types,unsigned,short,Java,Types,Unsigned,Short,如何在Java中声明无符号short值?在Java中没有这样的类型你真的不能。Java没有任何未签名的数据类型,除了char 诚然,您可以使用char——这是一种16位无符号类型——但在我看来,这太可怕了,因为char显然是用于文本的:当代码使用char时,我希望它用于表示程序感兴趣的文本的UTF-16代码单元,不是与文本无关的任意无符号16位整数。Java没有无符号类型。你需要它做什么 但是,Java确实有“byte”数据类型。是的,如果您想在代码和位操作中使用该值,则不需要这样做。您可以使用

如何在Java中声明
无符号short
值?

在Java中没有这样的类型

你真的不能。Java没有任何未签名的数据类型,除了
char


诚然,您可以使用
char
——这是一种16位无符号类型——但在我看来,这太可怕了,因为
char
显然是用于文本的:当代码使用
char
时,我希望它用于表示程序感兴趣的文本的UTF-16代码单元,不是与文本无关的任意无符号16位整数。

Java没有无符号类型。你需要它做什么


但是,Java确实有“byte”数据类型。

是的,如果您想在代码和位操作中使用该值,则不需要这样做。

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

不要使用字符-使用int:-)


这里是一个。

您可以自己编写一个
ShortUnsigned
类,并为您想要的运算符定义方法。您将无法重载
+
-
以及它们上面的其他对象,也无法与其他基元或数字对象类型进行隐式类型转换,唉


像其他一些回答者一样,我想知道为什么您迫切需要无符号的short,而没有其他数据类型可以填充它

如果您确实需要一个正好16位的值:

解决方案1:使用可用的带符号短字符,不要担心符号,除非您需要执行比较(=)或除法(/,%,>>)操作。有关如何将有符号数字当作无符号数字处理的信息,请参见


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

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


我们处理由定制嵌入式硬件记录的信号,因此我们处理大量来自a-D的无符号16。多年来,我们一直在各地使用字符,从未遇到过任何问题。

一个简单的程序来说明为什么需要无符号数字:

package shifttest;
public class ShiftTest{
    public static void main(String[] args){
        short test = -15000;
        System.out.format ("0x%04X 0x%04X 0x%04X 0x%04X 0x%04X\n",
            test, test>>1, test>>2, test>>3, test>>4);
    }
}
结果:

0xC568 0xFFFFE2B4 0xFFFFF15A 0xFFFFF8AD 0xFFFFFC56
现在,对于非系统类型的系统:


JAVA做算术移位是因为操作数是有符号的,然而,在有些情况下,逻辑移位是合适的,但是JAVA(特别是Sun)认为这是不必要的,这对我们的短视来说太糟糕了。当您所拥有的都是签名较长的数字时,Shift、And、Or和Exclusive Or是有限的工具。当连接到硬件设备时,这是一个特殊的问题,这些硬件设备使用16位或更多的“真实”计算机位。“char”不能保证工作(现在是两个字节宽),但在一些基于gif的东方语言中,如中文、韩文和日文,至少需要3个字节。我不熟悉对sandscript风格语言的数量需求。字节数并不取决于程序员,而是取决于JAVA标准委员会。因此,将字符设置为16位存在下游风险。为了安全地实现unsignedshortjava,asspecial类是基于上述模糊性的最佳解决方案。这个类的缺点是无法重载这个特殊类的数学运算。这个线程的许多贡献者准确地指出了这些问题,但我的贡献是一个工作代码示例,以及我在Linux下用C++中的3字节GIFS语言的经验。

< P>他说他想创建一个多维的短数组。但没有人建议使用位运算符?从我读到的,你想用16位整数代替32位整数来节省内存吗

所以首先开始10000 x 10000的短值是160000000位,2000000000字节,200000千字节,200兆字节

如果你需要200兆的内存消耗,你可能需要重新设计这个想法。我也不相信会编译,更不用说运行了。如果有任何东西利用了两个称为随需应变加载和数据缓存的特性,则永远不应该像这样初始化大型阵列。本质上,按需加载指的是只在需要时加载数据。然后,数据缓存也会做同样的事情,但会利用一个自定义框架来删除旧内存并根据需要添加新信息。这是一个棘手的有良好的速度性能。你还可以做其他事情,但如果做对了,这两件事是我最喜欢的

好的,回到我刚才说的关于位运算符的内容

所以是一个32位的整数或Java“int”。您可以将所谓的“位”存储到该文件中,因此假设您有32个布尔值,在Java中,所有值都占用32位(长除外),或者对于数组,字节占用8位,短16位,int占用32位。因此,除非您有数组,否则使用字节或短字符不会带来任何内存优势。这并不意味着您不应该将其用作确保您和其他人知道此值应具有的数据范围的一种方式

现在,正如我所说,通过执行以下操作,可以有效地将32个布尔值存储到一个整数中:

int many_booleans = -1; //All are true;
int many_booleans = 0; //All are false;
int many_booleans = 1 | 2 | 8; //Bits 1, 2, and 4 are true the rest are false;
所以现在一个short由16位组成,所以16+16=32,完全适合32位整数。所以每个int值可以由2个短值组成

int two_shorts = value | (value2 << 16);
假设我们要检索两个16位整数值

short value1 = (short)(assumed_value & 0xFFFF); //-1
short value2 = (short)(assumed_value >> 16); //=3

也基本上把位运算符看作是2的幂。这就是他们真正的样子。永远不要用0和1来看待它。我发布这篇文章主要是为了帮助任何可能遇到搜索无符号短数组甚至可能是多维数组的人。如果有任何打字错误,我很抱歉很快就写了出来。

来自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);
}
public final int readUnsignedShort()抛出
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);
}
import static org.joou.Unsigned.*;

// and then...
UShort s = ushort(1);
//вот метод для получения аналога unsigned short
    public static int getShortU(byte [] arr, int i )  throws Exception 
    {
       try
       {
           byte [] b = new byte[2]; 
           b[1] = arr[i];
           b[0] = arr[i+1];
           int k = ByteBuffer.wrap(b).getShort();
            //if this: 
           //int k = ((int)b[0] << 8) + ((int)b[1] << 0); 
           //65536 = 2**16
           if ( k <0) k = 65536+ k; 
        return k;
      }  
       catch(Throwable t)
      {
          throw  new Exception ("from getShort: i=" + i);
      }
    }
short signedValue = -4767;
System.out.println(signedValue ); // prints -4767

int unsignedValue = Short.toUnsignedInt(signedValue);
System.out.println(unsingedValue); // prints 60769