Java中的unsigned int(primitive)和Integer(Object)用法

时间:2014-07-25 20:47:42

标签: java unsigned-integer

我正在关注the Java tutorial on Primitive Data Types。在早期,它声明

  

在Java SE 8及更高版本中,您可以使用int数据类型来表示无符号的32位整数,其最小值为0,最大值为2 ^ 32-1。使用Integer类将int数据类型用作无符号整数。

我从这句话中理解的是,只要我使用Integer包装器对象而不是int原始数据类型,我现在可以存储最多2 ^ 32-1作为int。但是当我尝试这个时,我的编译器抱怨我使用的值太大,2 ^ 31。我已经尝试使用原始数据类型和Object。

Integer integerObjectLarge = 2147483648; //2^31
int integerPrimitiveLarge = 2147483648; //2^31

我究竟如何使用int / Integer存储无符号值,例如2 ^ 31?

3 个答案:

答案 0 :(得分:7)

我认为Java没有添加 true 无符号32位int类型。唯一改变的是Integer类现在包含一些将32位整数视为无符号32位整数的方法。请参阅Integer的javadoc中的compareUnsigneddivideUnsignedparseUnsignedInt和其他几个。 Long也有一些新方法。

但基本上,如果将位模式(例如)10001000_11110000_10010110_11000010存储在int中,int中没有任何内容表示“这是无符号整数”或“此是有符号整数“。这取决于您使用哪种方法来处理它。

答案 1 :(得分:1)

  

但是当我尝试这个时,我的编译器抱怨我使用的值太大,2 ^ 31。

您有错误,因为文字 2147483648在语法上无效。


  

我究竟如何使用int / Integer存储无符号值,例如2 ^ 31?

你仍然可以使用Integer类的新方法执行无符号算术,只是不要使用无效的文字:

int n = 2147483647 + 1;  // 2^31

System.out.println(Integer.toUnsignedString(n));  // treat int as unsigned
System.out.println(Integer.toString(n));          // treat int as signed
2147483648
-2147483648

  

我从这句话中理解的是,只要我使用整数包装器对象而不是int原始数据类型,我现在可以存储最多2 ^ 32-1作为int。

您可以使用基元类型int 存储 unsigned int,但是将该值用作无符号类型需要您使用Integer的实用程序方法,见上文。

答案 2 :(得分:1)

您始终可以存储"未签名"使用十六进制的整数文字:

 int x = 0xffffffff;
 // or any value >= 0x80000000;

这是因为,出于所有实际目的,编译器认为这些是"签署"。

您仍然无法指定小数值> 2 ^ 31 - 1因为如果突然允许这会产生各种向后兼容性问题。