当前位置: 首页 > 知识库问答 >
问题:

无符号int(原始)和整数(对象)在Java中的用法

陆高峰
2023-03-14

我正在学习基本数据类型的Java教程。在早期,它指出

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

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

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

如何使用整数/整数来存储无符号值,如2^31?

共有3个答案

华煜祺
2023-03-14

您始终能够使用十六进制来存储“无符号”整数文本:

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

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

您仍然无法分配十进制值

空佐
2023-03-14

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

出现错误是因为文字2147483648在语法上无效。

如何使用整数/整数来存储无符号值,如2^31?

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

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。

您可以使用基本类型<code>int的实用方法,如上文所示。

戚俊人
2023-03-14

我不认为Java添加了一个真正的无符号32位int类型。唯一更改的是 Integer 类现在包含一些方法,这些方法将 32 位整数视为无符号的 32 位整数。请参阅比较未签名除法未签名解析未签名Int和 javadoc 中的其他几个整数也有一些新的方法。

但基本上,如果您将位模式(例如)< code > 10001000 _ 11110000 _ 10010110 _ 11000010 存储在< code>int中,则< code>int中不会显示“这是一个无符号整数”或“这是一个有符号整数”。这取决于你用什么方法来处理它。

 类似资料:
  • 在Oracle“原始数据类型”页面中,它提到Java8增加了对无符号int和long的支持: 那么,有没有办法声明一个无符号的int或long呢?

  • 问题内容: 关于Java支持哪种无符号数据类型,我有些困惑。 我已经读过了,但我不理解它的非常复杂的解释(至少对我而言)。 问题答案: Java仅支持带符号的类型(除外),因为它假定对于初学者来说,一种类型比每种大小都具有两种类型更容易理解。在C语言中,它被认为是错误的根源,因此不包括对无符号类型的支持。 因此设计师选择了四种尺寸 ,8位 ,16位 ,32位 ,64位。 并保持一致性,他们都签署就

  • 问题内容: 我的问题与python中的sum函数有关。 所以我的代码是 我读到一个错误: 有人可以解释为什么会发生这种情况以及如何解决吗? 问题答案: 查看文档: sum(iterable [,开始]) 总和从左到右依次迭代一个项目,并返回总计。start默认为。可迭代项通常是数字,并且起始值不允许为字符串。 因此,您必须传递一个可迭代的参数,而不是整数! 应该可以正常工作。 此功能旨在在列表中存

  • 我正在练习Cay S.Horstmann的《Java SE 8 for the Really Impatient》一书中的练习。其中一个基于类中的改进的练习要求: 编写一个程序,使用< code>int值和无符号运算,对0和232 - 1之间的数进行加、减、除和比较。说明为什么需要< code>divideUnsigned和< code>remainderUnsigned。 问题是,如果您添加2个

  • 全新的汇编需要一些无符号算术方面的帮助。从C程序转换是什么意思。 使用: Linux操作系统 美国国家科学院 x86(32位) 我想从用户那里读入一个数字。我希望这个号码没有签名。当我输入一个超过有符号整数限制的数字并使用信息寄存器时,我注意到我的寄存器存储的是负数,这意味着发生了溢出。(显然输入的数字低于max unsigned int)如何将此寄存器视为无符号,以便根据结果进行比较和跳转?

  • 问题内容: 我正在尝试使用以下代码将包含Integer对象的ArrayList转换为原始int [],但它会引发编译时错误。是否可以用Java进行转换? 问题答案: 你可以进行转换,但是我认为没有内置的功能可以自动进行转换: (请注意,如果其中一个或任何一个元素为,则会抛出。) 编辑:根据评论,你可能希望使用列表迭代器来避免诸如: