【问题标题】:Unsigned int (primitive) and Integer (Object) usage in JavaJava中的无符号整数(原始)和整数(对象)用法
【发布时间】:2014-07-25 20:47:42
【问题描述】:

我正在关注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。我已经尝试过使用原始数据类型和对象。

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

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

【问题讨论】:

标签: java unsigned-integer


【解决方案1】:

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

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

【讨论】:

  • 是的,Java 语言的人延续了他们混淆而不是阐明的传统。
  • 我可以理解为什么他们可能不想添加新的原始类型。但我突然想到,他们可以添加一个新的文字后缀,而无需进行任何其他向后不兼容或更改任何其他语言规则,例如,2147483649U 将等同于 int -2147483647
  • 是的,可以添加后缀(尽管它可能需要对 JVM 进行较小的更改)。我想如果你使用L,那么你需要一个演员来防止编译器反对。
【解决方案2】:

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

您有一个错误,因为 literal 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。

您可以存储 unsigned int 使用原始类型int,但是将值用作无符号类型需要您使用Integer 的实用方法,如上所示。

【讨论】:

    【解决方案3】:

    您总是能够使用十六进制存储“无符号”整数文字:

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

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

    您仍然不能分配大于 2^31 - 1 的十进制值,因为如果突然允许这样做会产生各种向后兼容性问题。

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2015-09-01
      • 2010-09-19
      • 2013-08-29
      • 1970-01-01
      相关资源
      最近更新 更多