在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用作无符号整数。 像
compareUnsigned
,divideUnsigned
等静态方法已被添加到Integer类来支持无符号整数的算术运算。
请注意, int
variables在声明时仍然是有符号的,但现在可以使用Integer
类中的这些方法进行无符号运算。
在Java 8中有一个无符号Integer和Long的API!
int中的值是带符号还是无符号取决于位的解释方式 – Java将位解释为有符号值(它没有无符号原语)。
如果你有一个int,你想解释为一个无符号的值(例如,你从一个DataInputStream中读取一个int,你知道包含一个无符号的值),那么你可以做下面的技巧。
int fourBytesIJustRead = someObject.getInt(); long unsignedValue = fourBytesIJustRead & 0xffffffffl;
请注意,重要的是,hex文字是一个长文字,而不是一个整型文字 – 因此最后的'l'。
我们需要无符号数字来模拟MySQL的无符号TINYINT
, SMALLINT
, INT
, BIGINT
,这就是为什么我们创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。 它返回一个正数。