Java 在32位和64位计算机中,long始终为64位
我想知道x86和x64中的long是否都是64位?是。JavaJava 在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
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位上。。。