如何在Java中声明unsigned short
值?
答案 0 :(得分:65)
你不能,真的。除了char
之外,Java没有任何无符号数据类型。
不可否认,你可以使用char
- 这是一个16位无符号类型 - 但在我看来这很可怕,因为char
显然是用于文本:当代码使用char
时,我希望它用于表示程序感兴趣的文本的UTF-16代码单元,而不是与文本无关的任意无符号16位整数。
答案 1 :(得分:12)
如果你真的需要一个16位的值:
解决方案1:使用可用的签名短片并停止担心该标志,除非您需要进行比较(<,< =,>,> =)或除法(/ ,%,>>)操作。请参阅this answer了解如何处理带符号的数字,就好像它们是未签名的一样。
解决方案2(解决方案1不适用):使用int的低16位并使用&删除高位必要时填写0xffff。
答案 2 :(得分:12)
这是一个非常陈旧的主题,但为了后来的任何人的利益。 char是数字类型。它支持所有数学运算符,位操作等。它是无符号16。
我们处理由自定义嵌入式硬件记录的信号,因此我们处理来自A-D的大量无符号16。我们多年来一直在使用这些地方的字符,从来没有遇到任何问题。
答案 3 :(得分:10)
你可以使用一个char,因为它是一个无符号的16位值(虽然从技术上来说它是一个unicode字符,因此将来可能会被改为24位值)...另一种选择是使用一个int并确保它在范围内。
不要使用char - 使用int: - )
答案 4 :(得分:4)
来自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);
}
答案 5 :(得分:3)
java中没有这样的类型
答案 6 :(得分:1)
如果您想在代码与位操作中使用该值,那么就没有这样的事情。
答案 7 :(得分:1)
"In Java SE 8 and later, you can use the int data type to represent an unsigned 32-bit integer, which has a minimum value of 0 and a maximum value of 232-1."但是这只适用于int和long而不是short :(
答案 8 :(得分:1)
不,实际上没有这种方法,java是一种高级语言。因此,Java没有任何未签名的数据类型。
答案 9 :(得分:0)
他说他想创建一个多维短阵列。然而没有人建议按位运算符?从我读到的你想要使用32位整数的16位整数来节省内存?
首先,开始10,000 x 10,000个短值是1,600,000,000位,200,000,000字节,200,000千字节,200兆字节。
如果您需要200MB内存消耗的东西,您可能需要重新设计这个想法。我也不相信甚至会编译,更别说运行了。如果有任何东西使用称为按需加载和数据缓存的2个功能,则永远不应该初始化大型数组。基本上按需加载是指仅在需要时加载数据的想法。然后数据缓存执行相同的操作,但利用自定义框架工作来删除旧内存并根据需要添加新信息。这个具有良好的速度性能非常棘手。还有其他一些你可以做的事情,但如果做得对,这两个是我最喜欢的。
好的回到我对bitwise运算符的看法。
所以是32位整数或Java“int”。你可以存储所谓的“位”,所以假设你有32个布尔值,在Java中所有值占32位(长除外)或者对于数组,它们占用8个字节,16个简称,32个用于int 。因此,除非你有数组,否则你不会因使用字节或短数而获得任何内存优势。这并不意味着您不应该使用它作为确保您和其他人知道此值应具有的数据范围的方法。
现在正如我所说,通过执行以下操作,您可以有效地将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;
所以现在一个短路由16位组成,所以16 + 16 = 32,它完全适合32位整数。因此每个int值可以包含2个短值。
int two_shorts = value | (value2 << 16);
所以上面所做的是值是介于-32768和32767之间,或者是无符号值0 - 65535.所以让我们说值等于-1,因此无符号值为65535.这将意味着位1到16已打开,但实际执行数学时请考虑范围0 - 15.
因此我们需要激活位17-32。所以我们必须从大于15位的东西开始。所以我们从16位开始。因此,通过取值2并将其乘以65536,这就是“&lt;&lt; 16”所做的。我们现在可以说,value2等于3它将是OR 3x65536 = 196608.所以我们的整数值将等于262143.
int assumed_value = 262143;
所以我们想要检索两个16位整数值。
short value1 = (short)(assumed_value & 0xFFFF); //-1
short value2 = (short)(assumed_value >> 16); //=3
也基本上将按位运算符视为2的幂。这就是它们真正的全部。永远不要看0和1的条款。我大多发布这个来帮助任何可能遇到这种搜索无符号短或甚至可能是多维数组的人。如果有任何拼写错误我道歉很快写下来了。
答案 10 :(得分:0)
如果使用第三方库是一个选项,则有jOOU(来自jOOQ的衍生库),它为Java中的无符号整数提供包装类型。这与原始类型(以及字节代码)对无符号类型的支持并不完全相同,但对于您的用例,它可能仍然足够好。
import static org.joou.Unsigned.*;
// and then...
UShort s = ushort(1);
(免责声明:我为这些图书馆背后的公司工作)
答案 11 :(得分:0)
无法声明 unsigned short 类型,但就我而言,我需要获取无符号数才能在 for 循环中使用它。类 toUnsignedInt
中有方法 Short
返回“通过无符号转换转换为 int 的参数”:
short signedValue = -4767;
System.out.println(signedValue ); // prints -4767
int unsignedValue = Short.toUnsignedInt(signedValue);
System.out.println(unsingedValue); // prints 60769
Integer 和 Long 存在类似的方法:
Integer.toUnsignedLong
Long.toUnsignedString
:在这种情况下,它以 String
结尾,因为没有更大的数字类型。
答案 12 :(得分:-1)
Java没有无符号类型。你需要什么?
但是,Java确实具有'byte'数据类型。
答案 13 :(得分:-1)
您可以为ShortUnsigned
类编写代码,并为您想要的运算符定义方法。您将无法重载+
和-
及其他对象,也不能使用其他原始或数字对象类型进行隐式类型转换,唉。
像其他一些回答者一样,我想知道为什么你对无符号短语的这种迫切需要,没有其他数据类型会填补。
答案 14 :(得分:-1)
简单程序,显示为什么需要无符号数字:
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,and Exclusive或者是有限的工具,只要你拥有更长的数字。当与连接16位或更多位的“REAL”计算机位的硬件设备接口时,这是一个特殊问题。 “char”不能保证工作(它现在是两个字节宽)但是在几种基于东部gif的语言中,例如中文,韩文和日文,需要至少3个字节。我不熟悉sandscript风格语言的数量需求。字节数不依赖于程序员而是JAVA的标准委员会。因此将char作为16位具有下游风险。为了安全地实现无符号短路JAVA,特殊类是基于上述模糊性的最佳解决方案。该类的缺点是无法为这个特殊类重载数学运算。这个线程的许多贡献者准确地指出了这些问题,但我的贡献是一个有效的代码示例和我在Linux下使用C ++中的3字节gifs语言的经验。
答案 15 :(得分:-2)
//вот метод для получения аналога 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);
}
}