声明在Java中一个unsigned int

问题描述 投票:271回答:10

有没有宣布在Java中一个unsigned int的方法吗?

或者,这个问题也可以被诬陷为这样的:什么是Java等同的签名?

只是为了告诉你,我一直在寻找在Java的实现String.hashcode()的情况下。我想测试碰撞的可能性,如果该整数为32 unsigned int类型。

java integer unsigned
10个回答
278
投票

Java没有对unsigned integers数据类型。

您可以定义一个long代替int的,如果你需要存储较大的值。

您还可以使用有符号整数,就好像它是无符号。 two's complement representation的好处是,大多数操作(如加,减,乘,和左移位)是对符号和无符号的整数二进制电平是相同的。一些操作(师,右移,比较和铸造),但是,是不同的。从Java SE 8,在Integer类新的方法让您充分使用int数据类型to perform unsigned arithmetic

在Java SE 8和更高版本中,可以使用int数据类型来表示一个32位无符号整数,其具有最小值0和2 ^ 32-1的最大值。使用Integer类使用int数据类型为无符号整数。像compareUnsigneddivideUnsigned等静态方法已被添加到Integer类支持算术运算的无符号整数。

需要注意的是int宣告但无符号运算,现在可以通过使用Integer类的方法时,变量仍签署。


1
投票

有很好的答案在这里,但我看不出位操作的任何示威活动。像维瑟(目前公认的答案)说,Java的标志默认整数(Java的8具有无符号整数,但我从来没有使用过)。事不宜迟,让我们开始吧......

RFC 868 Example

如果你需要写一个无符号整数IO会发生什么?实际的例子是,当你根据RFC 868要输出的时间。这需要32位,大端,无符号整数自上午12点00编码的秒数1900年1月1日,你将如何编码呢?

制作自己的32位无符号整数,像这样:

声明的4个字节的字节阵列(2 ^ 31个比特)

Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)

现在你有(如果你想破坏的破坏或小端),以填补在大端顺序信息的阵列中的每个字节。假设你有一个长期包含时间(长整数都是64位长在Java中)被称为secondsSince1900(其中仅使用前32位的价值,并且您已经处理的事实,日期的引用12:00 AM 1970年1月1日),那么你可以使用逻辑与从中提取位,这些位转移到位置(位)时coersed成字节,将是不容忽视的,而在大端顺序。

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

我们my32BitUnsignedInteger是相当于现在的32位无符号,大端整数附着在RCF 868标准。是的,长期的数据类型是有符号的,但我们忽略了这个事实,因为我们假定secondsSince1900仅用于低32位)。因为coersing长为一个字节的所有位高于2 ^ 7(前两个十六进制数字)将被忽略。

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


-18
投票

您可以使用Math.abs(数字)功能。它返回一个正数。



60
投票

无论是在一个int值带有符号取决于如何位被解释 - Java的解释为符号值位(它不具有签名原语)。

如果你要解释为无符号值的int(例如你读,你知道包含一个无符号值一个DataInputStream一个int),那么你可以做下面的技巧。

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

请注意,这是很重要的十六进制文字是一个长期的文字,而不是一个int文本 - 因此,“L”结尾。


18
投票

我们需要的无符号数来模拟MySQL的无符号TINYINTSMALLINTINTBIGINTjOOQ,这就是为什么我们创建jOOU,简约库,提供包装类在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。希望这可以帮助。

(声明:我这些库背后的公司工作)


7
投票

对于无符号数,你可以使用这些类从Guava library

它们支持各种操作:

  • 减去
  • 针对
  • 除以

这似乎在目前缺少的东西是字节移位运算符。如果你需要那些可以从Java使用的BigInteger。


4
投票

使用char 16位无符号整数。


2
投票

看来你可以处理做一个“逻辑与”签约问题上的值使用它们之前:

实施例(的byte[] header[0]值是0x86):

System.out.println("Integer "+(int)header[0]+" = "+((int)header[0]&0xff));

结果:

Integer -122 = 134

1
投票

也许,这就是你的意思?

long getUnsigned(int signed) {
    return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed;
}
  • getUnsigned(0)→0
  • →1个getUnsigned(1)
  • getUnsigned(Integer.MAX_VALUE) 2147483647
  • getUnsigned(Integer.MIN_VALUE) 2147483648
  • getUnsigned(Integer.MIN_VALUE + 1) 2147483649

1
投票

刚才这一段代码,至极“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);
                    }
© www.soinside.com 2019 - 2024. All rights reserved.