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

8
我正在研究一个Java应用程序,可以在32位和64位系统上运行,并且主要处理IP地址。这些IP地址被保存为整数,正常类型在64位平台上会浪费大量内存(是的,内存使用已经成为一个问题)。如何声明32位整数值,即使在x64架构上也保持为32位?
由于我是Java新手,如果有一个内置类型已经设计好处理IP地址,请随意指出 ;)

3
我认为Java中的int是32位类型?! - Khaled Alshaya
1
@Joel Java没有无符号类型;他们将它们省略掉是为了“避免混淆”。 - Michael Mrozek
2
@Joel Coehoorn: 有用的参考资料:http://www.darksleep.com/player/JavaAndUnsignedTypes.html - andersoj
1
这就是我不喜欢这个网站的原因。像这样的问题竟然得到了9个回答。人们!你们怎么了? - Dimitris Andreou
2
@Dimitris 为什么这个问题不应该有答案?或者说不应该有很多答案?投票按钮是有原因的... - Santa
显示剩余5条评论
11个回答

32

为了保证可移植性,Java为其数据类型设定了特定的宽度。即使在64位平台上,整数也是32位宽。 Java语言规范非常明确地表示(我稍微改写了一下以便更易读):

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

这可能是由于C语言存在许多可移植性问题所导致的,其中包括不同宽度(甚至编码方式,例如二进制补码、反码和原码)的整数。Java希望避免这些问题,特别是因为它旨在运行在尽可能多的不同平台上。

至于用于处理IP地址的内置类型,Java有Inet4AddressInet6Address,具体取决于您的需要(以及它们的共同祖先InetAddress)。


5
Java没有无符号类型。 - cobbal

11

即使在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可以管理的内存量。

但是,64位VM的内部实现将影响内存使用:

一般来说,与在32位VM上运行相同的应用程序相比,能够寻址更大内存的好处伴随着64位VM中的小型性能损失。这是因为系统中的每个本地指针占用8个字节而不是4个字节。加载此额外数据会影响内存使用情况,这会转化为稍微较慢的执行,具体取决于在执行Java程序期间加载了多少指针。

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


4
请使用原始的int类型,它在所有Java平台上都是32位的;请参见JLS 4.2.1。如果您担心在内存中表示大量IP地址时的内存使用情况,那么可能需要采取以下措施:
  • 不要将IP地址保存在内存中,
  • 增加Java堆大小,或者
  • (如有必要)升级硬件或操作系统。
又或许,您已经过分关注了内存“浪费”。Java本质上需要占用大量内存,实际上最好的办法是让它拥有所需的一切。 后续更新 Java没有无符号int类型。但是,您没有必要使用它来表示IP地址,特别是因为您不需要对它们进行算术运算。
(即使您需要进行算术运算,也有方法可以做到。请注意,如果您想从Java应用程序中挤取最后一丝内存“浪费”,则必须采取一些不太美观的措施。)

3

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


1

不要担心,在Java中,int类型已经被定义为32位(与C/C++不同),可以在这里找到更多信息。


1

int 在每个平台上都是32位的。但是,要使它无符号,您必须手动移位数字等 - 这确实变得复杂。为什么不使用byte[]或long呢?


0
在Java中,int是32位的,long是64位的。因此,如果它大于32位,你需要使用long。

0

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

整数类型包括byte、short、int和long,它们的值分别为8位、16位、32位和64位的带符号二进制补码整数,char类型的值是16位无符号整数,表示Unicode字符。

因此,按定义,int已经是32位的,尽管解释器可能会将其放在64位边界上以加快访问速度。


0
Java中的“int” / “Integer”不依赖于平台,它始终是32位。平台相关的是com.sun.jna.ptr.IntByReference。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接