[英]Unsigned int (primitive) and Integer (Object) usage in Java
我正在关注原始数据类型的Java教程 。 早期,它说明了这一点
在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?
我认为Java没有添加真正的无符号32位int
类型。 唯一改变的是Integer
类现在包含一些将32位整数视为无符号32位整数的方法。 有关Integer
的javadoc,请参阅compareUnsigned
, divideUnsigned
, parseUnsignedInt
和其他几个。 Long
也有一些新方法。
但基本上,如果将位模式(例如) 10001000_11110000_10010110_11000010
在int
,则int
中没有任何内容表示“这是无符号整数”或“这是有符号整数”。 这取决于您使用哪种方法来处理它。
但是当我尝试这个时,我的编译器抱怨我使用的值太大,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
我从这句话中理解的是,只要我使用Integer包装器对象而不是int原始数据类型,我现在可以存储最多2 ^ 32-1作为int。
您可以使用基本类型int
存储 unsigned int,但是将该值用作无符号类型需要您使用Integer
的实用方法,如上所示。
您始终可以使用十六进制存储“无符号”整数文字:
int x = 0xffffffff;
// or any value >= 0x80000000;
这是因为,出于所有实际目的,编译器认为这些是“签名”的。
您仍然无法指定小数值> 2 ^ 31 - 1,因为如果突然允许这会产生各种向后兼容性问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.