在Java中声明无符号int

在Java中声明无符号int,java,integer,unsigned,Java,Integer,Unsigned,有没有在Java中声明无符号int的方法 或者,这个问题也可以这样表述: 无符号的Java等价物是什么 我只是想告诉你我在看String.hashcode的Java实现的上下文。我想测试如果整数是32个无符号整数,是否会发生冲突。Java没有用于的数据类型 如果需要存储较大的值,可以定义一个而不是一个int 您还可以将有符号整数当作无符号整数使用。的好处是,对于有符号整数和无符号整数,大多数操作(如加法、减法、乘法和左移位)在二进制级别上是相同的。然而,一些业务部门、右移、比较和铸造则有所不同。

有没有在Java中声明无符号int的方法

或者,这个问题也可以这样表述: 无符号的Java等价物是什么


我只是想告诉你我在看String.hashcode的Java实现的上下文。我想测试如果整数是32个无符号整数,是否会发生冲突。

Java没有用于的数据类型

如果需要存储较大的值,可以定义一个而不是一个int

您还可以将有符号整数当作无符号整数使用。的好处是,对于有符号整数和无符号整数,大多数操作(如加法、减法、乘法和左移位)在二进制级别上是相同的。然而,一些业务部门、右移、比较和铸造则有所不同。从Java SE 8开始,类中的新方法允许您充分使用int数据类型:

在JavaSE8及更高版本中,可以使用int数据类型表示无符号32位整数,其最小值为0,最大值为2^32-1。使用Integer类将int数据类型用作无符号整数。诸如等静态方法已添加到Integer类中,以支持无符号整数的算术运算


注意,int变量在声明时仍然是有符号的,但是现在可以在Integer类中使用这些方法进行无符号算术。

您可以使用Math.absnumber函数。它返回一个正数。

整数中的值是有符号的还是无符号的取决于位的解释方式—Java将位解释为有符号的值—它没有无符号原语

如果您有一个要解释为无符号值的int,例如,您从DataInputStream中读取一个int,您知道该int应该被解释为无符号值,那么您可以执行以下技巧

int fourBytesIJustRead = someObject.getInt();
long unsignedValue = fourBytesIJustRead & 0xffffffffL;

请注意,十六进制文字是长文字,而不是整型文字,这一点很重要,因此在末尾使用“L”。

对于无符号数字,您可以从以下位置使用这些类:

它们支持各种行动:

加 减 时代 摩登派青年 分开
目前似乎缺少的是字节移位运算符。如果您需要这些,您可以使用Java中的BigInteger。

我们需要无符号数字来为MySQL的无符号TINYINT、SMALLINT、INT、BIGINT-in建模,这就是为什么我们创建了一个最小化库,为Java中的无符号整数提供包装类型。例如:

import static org.joou.Unsigned.*;

// and then...
UByte    b = ubyte(1);
UShort   s = ushort(1);
UInteger i = uint(1);
ULong    l = ulong(1);
所有这些类型都扩展了java.lang.Number,可以转换为高阶基元类型和BigInteger。希望这有帮助


免责声明:我在这些库后面的公司工作

也许这就是你的意思

long getUnsigned(int signed) {
    return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed;
}
getUnsigned0→ 0 getUnsigned1→ 1. getUnsignedInteger.MAX\u值→ 2147483647 getUnsignedInteger.MIN\u值→ 2147483648 getUnsignedInteger.MIN_值+1→ 2147483649
使用char表示16位无符号整数。

刚刚制作了这段代码,它将this.altura从负数转换为正数。希望这能帮助有需要的人

       if(this.altura < 0){    

                        String aux = Integer.toString(this.altura);
                        char aux2[] = aux.toCharArray();
                        aux = "";
                        for(int con = 1; con < aux2.length; con++){
                            aux += aux2[con];
                        }
                        this.altura = Integer.parseInt(aux);
                        System.out.println("New Value: " + this.altura);
                    }

似乎可以通过在使用值之前对值执行逻辑AND来处理签名问题:

字节[]头[0]的示例值为0x86:

结果:


这里有很好的答案,但我没有看到任何按位操作的演示。正如Visser目前接受的答案所说,Java签名整数默认情况下Java8有无符号整数,但我从未使用过它们。不用再麻烦了,让我们做吧

RFC 868示例 如果需要将无符号整数写入IO,会发生什么情况?实际的例子是,当您想要根据输出时间时。这需要一个32位的大端无符号整数,该整数对1900年1月1日凌晨12:00以来的秒数进行编码。您将如何对其进行编码

按如下方式创建自己的无符号32位整数: 声明一个4字节32位的字节数组

Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
这将初始化数组,请参见。现在,如果你想破坏浩劫,你必须用大端序或小端序的信息填充数组中的每个字节。假设有一个long,它包含一个64位长的整数,在Java中称为secondsSince1900,它只使用前32位值,并且处理了日期引用1970年1月1日凌晨12:00的事实,然后,您可以使用逻辑AND从中提取位,并将这些位转换为在合并为字节时不会被忽略的位置数字,并且以大端顺序

my32BitUnsignedInteger[0] = (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24); // first byte of array contains highest significant bits, then shift these extracted FF bits to first two positions in preparation for coersion to Byte (which only adopts the first 8 bits)
my32BitUnsignedInteger[1] = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
my32BitUnsignedInteger[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
my32BitUnsignedInteger[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL); // no shift needed
我们的My32位无符号整数现在相当于符合RCF 868标准的无符号32位大端整数。是的,长数据类型是有符号的,但是我们忽略了这个事实,因为我们假设secondsSince1900只使用较低的32位。由于将long合并为一个字节,所有高于2^7的位都将被忽略


参考资料来源:Java网络编程,第4版。

Java中没有未签名的类型。这篇文章可能会帮助您解决这个问题

看起来有点不对劲。相关:这取决于你想要达到的目的。在大多数情况下,Java中的所有整数都是有符号的。但是,在一种特定情况下,您可以将有符号整数视为无符号整数:您可以使用>>>运算符而不是>>>来右移,而无需进行符号扩展。公平地说,对于许多项目来说,技术要求并没有那么严格,您确实可以承受这样的内存浪费。我知道,我也理解Java的原始用途。但举例来说,智能手机不会配置额外的内存。据我所知,他们通常使用Java。但是,我不想在Java程序员和其他人之间挑起一场战争。对我来说,这不仅仅是浪费金钱。当您在位级别上工作时,unsigned更容易使用。从Java8开始,这不再是事实。在Java SE 8及更高版本中,可以使用int数据类型表示无符号32位整数,其最小值为0,最大值为2^32-1。-请参阅和@7SpecialGems:我已更新了答案以包含该信息。也就是说,不可能声明无符号整数或排除负值,通过使用各种方法,只能将int当作无符号来使用。吹毛求疵:如果传入MIN,则不能_VALUE@kyo722我无法想象这将在无符号原语的范围内返回正值。挑剔2:如果你传入0,则不会。对我来说,这是最好的答案。。。我的数据来自NFC卡UID,它可以有4或8个字节。。。在4字节的情况下,我需要将其转换为无符号int,而我不能使用ByteBuffer.getLong,因为它不是64位数据。谢谢。为什么需要很长时间呢。难道不能只执行0xFFFFFF并保留int吗?使用三元运算符而不是if语句进行惰性键入会牺牲无数分之一秒的性能时间。不好的。你真的认为2*long Integer.MAX\u VALUE+2比0x1\u 0000\u 0000L更容易理解吗?在这方面,为什么不直接返回签名的&0xFFFF_FFFFL@stas我很难理解它的用途,也很难理解使用无符号数据类型的能力。从我在网上读到的各种资料来看,它似乎只是围绕着扩大最大值,而隐含的本质保证了它是一个正数。我的理解正确吗,还是有其他主要原因?另外,现在Java8中的Integer类允许使用unsigned int,这就是空间和速度之间的区别,因为在C/C++中它们是基本的,而在Java中,它是一个完整的对象wrapper@Abdul-当您在位级别工作时,通常是因为您正在与硬件进行接口,所以您需要以特定的方式处理这些值。ie-11111111之后的滚动到00000000等。使用有符号代替无符号会破坏CRC计算等。它不是一个显示障碍,只是浪费了时间。@Lorne K:在Java中,整数滚动,即使它们是有符号的。这是C/C++中未签名的滚动,但签名会导致溢出的“未定义行为”。如果“滚动”是您唯一关心的问题,则不需要未签名。我想,这就是为什么CRC例程等不用额外努力就能在Java中工作的原因。这就是为什么新API只添加了解析、格式化、比较、除法和余数。所有其他操作,即所有的位操作,还有加法、减法、乘法等,无论如何都是正确的。@Ciprian Tomiaga:对于滚动加法,输入和结果的位模式不取决于您是将其解释为有符号数还是无符号数。如果你有耐心,你可以试着用所有的2个⁶⁵ 组合…@Holger谢谢你的解释!事实上,这就是为什么我们实际上使用2的补码。我确实尝试了一些2^8组合^^Char不是32位无符号int,但Char是一个很好的内存增益答案。这个链接:从上面的jqr这听起来很方便!谢谢你的提醒这是新数组的java实现吗?Byte my32bit unsignedinteger[]=新字节[4]//表示时间s这对我来说有点“嗯”。我记得你应该做这个字节[]my32BitUnsignedInteger=新字节[4],如果我错了,请纠正我。@Yolomep是的,这是Java语法。在类型或名称后面加括号很好。我不知道。我认为这种数组声明只针对C++,字节是盒装类。您想使用byte[]数组=新字节[4]
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
my32BitUnsignedInteger[0] = (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24); // first byte of array contains highest significant bits, then shift these extracted FF bits to first two positions in preparation for coersion to Byte (which only adopts the first 8 bits)
my32BitUnsignedInteger[1] = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
my32BitUnsignedInteger[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
my32BitUnsignedInteger[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL); // no shift needed