在Java中是否有一种方法来声明无符号整型?

或者这个问题也可以是这样的: Java中与unsigned等价的是什么?

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


当前回答

也许这就是你的意思?

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 获取未签名(Integer.MIN_VALUE+1) → 2147483649

其他回答

似乎你可以通过在使用值之前对它们进行“逻辑与”来处理签名问题:

使用实例(byte[] header[0]的值为0x86):

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

结果:

Integer -122 = 134

对16位无符号整数使用char。

也许这就是你的意思?

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 获取未签名(Integer.MIN_VALUE+1) → 2147483649

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

UnsignedInteger UnsignedLong

它们支持各种操作:

+ - 次 国防部 除以

目前似乎缺少的是字节移位操作符。如果需要,可以从Java中使用BigInteger。

Java没有无符号整数的数据类型。

如果需要存储较大的值,可以定义long类型而不是int类型。

也可以像使用无符号整数一样使用有符号整数。two的补体表示的好处是,对于有符号整数和无符号整数,大多数操作(如加法、减法、乘法和左移)在二进制级别上是相同的。但是,有一些操作(除法、右移、比较和强制转换)是不同的。从Java SE 8开始,Integer类中的新方法允许您完全使用int数据类型来执行无符号算术:

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

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