在Java中无符号短小

我怎样才能在Java中声明一个unsigned short值?

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

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

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

解决scheme1:除非需要进行比较(<,<=,>,> =)或除法(/,%,>>)操作,否则请使用可用的签名short并停止担心签名。 看到这个答案如何处理签名的数字,就好像他们是无符号的。

解决scheme2(解决scheme1不适用):使用int的低16位,必要时用&0xffff删除高位。

你可以使用一个字符,因为它是一个无符号的16位值(尽pipe技术上它是一个Unicode字符,所以将来可能会变成一个24位的值)另一种方法是使用一个int,并确保它在范围之内。

不要使用字符 – 使用int 🙂

这里是讨论Java的一个链接,缺less未签名 。

这是一个非常陈腐的话题,但是为了任何人的利益。 char是一个数字types。 它支持所有的math运算符,位操作等,它是一个无符号的16。

我们处理由定制embedded式硬件logging的信号,所以我们处理了很多来自A-D的无符号16位。 我们一直在使用字符多年,从来没有任何问题。

在java中没有这种types

从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); } 

是的,没有这样的事情,如果你想使用代码与位操作的值。

“在Java SE 8和更高版本中,可以使用int数据types来表示无符号的32位整数,其最小值为0,最大值为232-1。 但是,这只适用于int和长,但不短:

他说他想创build一个多维短arrays。 然而没有人build议按位运算符? 从我读你想要使用32位整数16位整数来节省内存?

所以首先开始10,000 x 10,000个短值是1,600,000,000位,200,000,000个字节,200,000千字节,200兆字节。

如果你需要200MB的内存消耗,你可能需要重新devise这个想法。 我也不相信甚至不会编译运行。 如果有任何东西使用了2个名为“按需加载”和“数据caching”的function,则不应该像这样初始化大型数组。 本质上按需加载指的是只根据需要加载数据的想法。 然后数据caching做同样的事情,但利用自定义框架工作删除旧的内存,并根据需要添加新的信息。 这是一个很难有好的速度performance。 还有其他的事情你可以做,但是这两个是我最喜欢做的。

好吧,回到我所说的按位运算符。

所以一个32位的整数或Java中的“int”。 你可以存储所谓的“位”,所以假设你有32个布尔值,在Java中,所有的值都占用32位(long除外),对于数组,它们占用8个字节,简称16,32 。 所以,除非你有arrays,否则使用一个字节或短字符不会获得任何内存好处。 这并不意味着你不应该用它来确保你和其他人知道这个值应该有的数据范围。

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

 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; 

所以现在一个短的16位组成16 + 16 = 32,这完全符合32位整数。 所以每个int值都可以由2个short值组成。

 int two_shorts = value | (value2 << 16); 

所以上面这样做的值是介于-32768和32767之间,或者是一个无符号值0-65535。所以我们假设值等于-1,因此无符号值是65535。这意味着位1到16被打开,但实际进行math考虑的范围为0 – 15。

所以我们需要激活位17 – 32,所以我们必须从大于15位的位开始。 所以我们从16位开始。 所以把价值2乘以65536这就是“16”所做的。 我们现在可以让我们说value2等于3它将OR'd 3×65536 = 196608.所以我们的整数值将等于262143。

 int assumed_value = 262143; 

所以我们说我们想要检索两个16位整数值。

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

也基本上把按位运算符看作是2的幂。这就是他们真正的。 不要看它的0和1的条款。 我主要发布这个帮助任何人可能遇到这个search未签名的短,甚至可能是multidimensional array。 如果有任何错字,我很抱歉很快就写下来了。

Java没有无符号types。 你需要什么?

Java确实有“字节”数据types,但是。

你可以自己编写一个ShortUnsigned类,并为你想要的那些操作符定义方法。 您将无法重载+-以及其他对象,也不能使用其他原始或数字对象types进行隐式types转换。

像其他一些答复者一样,我想知道为什么你有这样一个紧迫的需求,没有其他数据types将被填充。

简单的程序来显示为什么需要无符号数字:

 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 

现在对那些不是系统types的人来说:

JAVA算术转换是因为操作数是有符号的,但是,有些情况下逻辑转换是合适的,但JAVA(特别是Sun)认为这是不必要的,对于我们短视而言太糟糕了。 Shift,And,或者Exclusive和Or是有限的工具,当你所有的人签署了更长的数字。 当与硬件设备连接时,这是一个特别的问题,这些硬件设备是16位或更多的“REAL”计算机位。 “字符”不能保证工作(现在是两个字节),但在几个东部的基于gif的语言,如中文,韩文和日文,至less需要3个字节。 我不熟悉sandscript风格语言的需要。 字节数不取决于程序员而是JAVA标准委员会。 所以将字符作为16位存在下游风险。 为了安全地实现未签名的短裤JAVA,作为特殊的类是基于上述歧义的最佳解决scheme。 这个类的缺点是无法为这个特殊类重载math运算。 这个线程的许多贡献者准确地指出了这些问题,但我的贡献是一个工作代码的例子,以及我在Linux下使用C ++ 3字节gif语言的经验。