在Java中声明一个unsigned int

有没有办法在Java中声明一个unsigned int?

或者这个问题也可能被这样描述:什么是Java的无符号等价?

只是为了告诉你我正在看Java的String.hashcode()的实现的上下文。 我想testing碰撞的可能性,如果整数是32 unsigned int。

Java没有无符号整数 。

你可以定义一个long而不是int如果你需要存储大的值,但是没有办法排除负值。

但是,从Java SE 8开始, Integer类中有一些新的方法允许您使用int数据types执行无符号的运算 :

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

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

在Java 8中有一个无符号Integer和Long的API!

int中的值是带符号还是无符号取决于位的解释方式 – Java将位解释为有符号值(它没有无符号原语)。

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

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

请注意,重要的是,hex文字是一个长文字,而不是一个整型文字 – 因此最后的'l'。

我们需要无符号数字来模拟MySQL的无符号TINYINTSMALLINTINTBIGINT ,这就是为什么我们创build了jOOU ,这是一个简单的库,为Java中的无符号整数提供封装types。 例:

 import static org.joou.Unsigned.*; // and then... UByte b = ubyte(1); UShort s = ushort(1); UInteger i = uint(1); ULong l = ulong(1); 

所有这些types都扩展java.lang.Number并可以转换为高阶基元types和BigInteger 。 希望这可以帮助。

(免责声明:我为这些图书馆背后的公司工作)

对于无符号数字,您可以使用Guava库中的这些类:

  • UnsignedInteger
  • UnsignedLong

他们支持各种操作:

  • 减去
  • MOD
  • 除以

目前似乎缺less的东西是字节移位操作符。 如果您需要这些,您可以使用Java中的BigInteger。

也许这就是你的意思?

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

使用16位无符号整数的char

只是做了这段代码,将“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); } 

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