如何在java中声明32位整数?

时间:2010-10-31 23:38:03

标签: java integer 32bit-64bit

我正在寻找一个在32位和64位系统上运行的java应用程序,它主要处理IP地址。这些IP地址保持为整数,正常类型在64位平台上浪费了大量内存(是的,内存使用已经被证明是一个问题)。如何声明即使在x64架构上仍保持32位的32位积分值?

由于我是java新手,如果有一个已经设计用于处理IP地址的内置类型,请随时向我指出;)

11 个答案:

答案 0 :(得分:27)

Java的数据类型具有特定的宽度,以实现可移植性。即使在64位平台上,整数也是32位宽。 Java language specificationquite clearly(在我看来,略微改编以使其更具可读性):

  

整数类型是byte,short,int和long,其值分别是8位,16位,32位和64位有符号二进制补码整数,以及char,其值为16位表示UTF-16代码单元的无符号整数。

这可以说是由于C中发现的许多可移植性问题,它们具有不同的宽度(甚至是编码,例如两个补码,一个补码和符号/幅度),这些整数是Java希望避免的,特别是因为它本来要运行在尽可能多的不同平台上。

对于处理IP地址的内置类型,Java同时具有Inet4AddressInet6Address,具体取决于您的需求(及其共同祖先InetAddress)。

答案 1 :(得分:8)

即使在64位机器上,int也是32位,你不需要做任何事情。

来自Java语言规范(http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  

int数据类型是32位带符号的二进制补码整数。它的最小值为-2,147,483,648,最大值为2,147,483,647(含)。对于整数值,此数据类型通常是默认选择。此数据类型很可能足以容纳您的程序将使用的数字,但如果您需要更宽范围的值,请使用long。

32位和64位Java VM之间的主要区别在于最大堆大小,即VM可以管理的内存量。

但是,64位虚拟机的内部实现会对内存使用产生影响:

  

通常,与在32位VM上运行相同的应用程序相比,能够处理大量内存的好处是64位VM中的性能损失很小。这是因为系统中的每个本机指针占用8个字节而不是4个。这个额外数据的加载会对内存使用产生影响,这会导致执行速度稍慢,具体取决于执行期间加载的指针数量。你的Java程序。

来自:http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#64bit_description

答案 2 :(得分:3)

使用原始int类型。它在所有Java平台上都是32位;见JLS 4.2.1

  

是的,内存使用已被证明是一个问题

好吧,如果你这样说。

我们不知道你在这做什么。但是如果你担心在内存中代表大量IP地址的内存使用情况,那么你可能需要:

  • 不要将IP地址保留在内存中,
  • 增加Java堆大小,或
  • (如有必要)调整硬件或操作系统的大小。

或者你可能只是记忆中的“浪费”不成比例。 Java本质上是内存饥渴,实用的答案是让它拥有它想要的东西。

关注

Java没有未签名的int类型。但是,您不需要它来表示IP地址,尤其是因为您不需要对它们进行算术运算。

(即使你做了,也有办法做到这一点。请记住,如果你想从Java应用程序中挤出最后一盎司的内存“浪费”,你将需要做一些丑陋的事情。)

答案 3 :(得分:2)

int原始类型的java具有32位的固定大小

答案 4 :(得分:1)

不要担心,Java中的int类型(与C / C ++不同)被定义为32位,如上所述here

答案 5 :(得分:1)

int在每个平台上都是32位。然而,为了使它无符号,你必须手动移动数字和这样的东西 - 它真的变得复杂。为什么不使用byte []或long?

答案 6 :(得分:0)

来自http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html

  

整数类型是字节,短,   int和long,其值为8位,   16位,32位和64位签名   二进制补码整数   分别和char,其值   是16位无符号整数   表示Unicode字符。

所以int的定义已经是32位,尽管解释器可能将它放在内存中的64位边界上以加快访问速度。

答案 7 :(得分:0)

Java中的

“int”/“Integer”与平台无关。它总是32位。平台相关的是com.sun.jna.ptr.IntByReference。

答案 8 :(得分:0)

在java中已经是32位了。多头是64位。

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

答案 9 :(得分:0)

在java中,int是32位。多头是64位。因此,如果is大于32位,则需要很长时间。

答案 10 :(得分:-1)

最好的方法是导入新库

>>> MultisetTuple((3, 6, 2, 4, 2, 8)) == MultisetTuple((8, 4, 3, 6, 2, 2))
True

>>> MultisetTuple((3, 6, 2, 4, 2, 8)) == MultisetTuple((8, 4, 3, 6, 4, 2))
False