在 Java 中声明无符号的 int

2022-08-31 04:43:59

有没有办法在Java中声明一个无符号的int?

或者这个问题也可以这样框定:Java相当于无符号是什么?

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


答案 1

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

您可以定义长整型,而不是如果需要存储大值。int

您还可以使用有符号整数,就好像它是无符号的一样。二进制补码表示的好处是,对于有符号和无符号整数,大多数运算(如加法、减法、乘法和左移)在二进制级别上都是相同的。然而,一些操作(分割,右移,比较和铸造)是不同的。从 Java SE 8 开始,Integer 类中的新方法允许您完全使用数据类型来执行无符号算术int

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

请注意,变量在声明时仍具有符号,但现在可以通过在类中使用这些方法进行无符号算术运算。intInteger


答案 2

int 中的值是有符号还是无符号取决于位的解释方式 - Java 将位解释为有符号值(它没有无符号基元)。

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

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

请注意,重要的是十六进制文字是长文字,而不是int文字 - 因此末尾的“L”。