Java 在32位和64位计算机中,long始终为64位

Java 在32位和64位计算机中,long始终为64位,java,Java,我想知道x86和x64中的long是否都是64位?是。Javalong在任何JVM上都是64位的,毫无例外。所有Java原语类型都是完全可移植的,并且在所有实现中都有固定的大小。是。长的称为64位整数。基元类型的大小始终相同。只有引用的大小可以更改,但您通常不需要知道这一点 您可以使用 int addressSize = Unsafe.addressSize(); 注意:即使在64位JVM(在最新的Java6+JVM上)中,引用也是32位的,但除非使用32GB或更大的堆。这是OpenJDK/S

我想知道x86和x64中的long是否都是64位?

是。Java
long
在任何JVM上都是64位的,毫无例外。所有Java原语类型都是完全可移植的,并且在所有实现中都有固定的大小。

是。长的
称为64位整数。

基元类型的大小始终相同。只有引用的大小可以更改,但您通常不需要知道这一点

您可以使用

int addressSize = Unsafe.addressSize();

注意:即使在64位JVM(在最新的Java6+JVM上)中,引用也是32位的,但除非使用32GB或更大的堆。这是OpenJDK/Sun/oraclejdk上的默认值,但是正如@user988052所指出的,ibmjvm需要在命令行上设置适当的标志。其他JVM可能根本不支持此选项。

定义为是,但请注意使用文本的long声明:

final long num = 1000 * 1000 * 1000 * 3; // Looks fine, right ?
System.out.println("num=" + num);
Prints: num=-1294967296
所以num是负数。。。由于溢出

另请参见此帖子(C#但类似):

解决方案:您必须使用
L
在某个地方指定它是一个长字符:

final long num = 1000 * 1000 * 1000 * 3L;
System.out.println("num=" + num);
Prints: num=3000000000

坏的是,只要这个数字足够小,编译器就不会抱怨。。。因此,这会导致运行时出现问题,这取决于代码,您可能甚至没有注意到这些问题。

是的,代码< >代码>长< /C> >因为Java是独立于平台的,所以在java中是64位的,但是C++中,如果机器是32位或64位,那么它的大小可能会有所不同。对于EG:<代码> int <代码>,在64位机器中的C++中大小为32位,但在32位机器中,大小只有16位。

JLS参考:即使在64位JVM(LabeStjava Java+JVMS)上,引用也是32位,除非使用32 GB堆或更大…这不依赖于JVM吗-XX:+UseCompressedOOps on Oracle/Sun JVM现在确实是默认的,据我所知,但显然IBM JVM(例如)指定,如果不使用其Xcompressedrefs VM参数,则默认情况下引用存储在64位上。。。