在Oracle.com我看过:
如果可能的话,你应该避免使用long,因为即使在64位上,long在不同的操作系统上也有不同的大小。 Windows 64位平台将long定义为4个字节,但大多数Unix操作系统指定long的大小为8个字节。
这句话是什么意思?当我想存储超过~2 ^ 31的值时,JVM如何存储这个值?
在计算中,JVM使用RAX或EAX寄存器?
我知道BigInteger
,但我对原始长型感兴趣。
答案 0 :(得分:1)
你已经脱离了背景。完整的上下文是:
64位Java
本机代码如何受到影响?
...
将32位本机代码移植到64位Java平台时,您将会这样做 需要将代码修改为64位清理。这包括检查 你的C / C ++代码,并寻找假定大小为a的代码 指针是4个字节或指针可以转换和存储在一个 整数。移植32位时,长数据类型也很麻烦 码。 如果可能的话,你应该避免使用longs 即使在不同的操作系统中,多头也有不同的尺寸 64位。 Windows 64位平台将long定义为4个字节,但大多数 Unix操作系统指定long的大小为8个字节。 For 更多细节,请参阅以下链接了解更多信息 64位编程。
回答你的问题:
长型的Java大小?
所有平台上的Java long
类型都是64位。
这句话是什么意思?
这是不言而喻的,但显然不是指Java long
类型。它指的是在本机代码中使用C或C ++ long
类型。
当我想存储超过~2 ^ 31的值时,JVM如何存储这个值?
在Java代码中,使用long
。有用。 JVM实现在不同平台上以不同方式处理它。别担心。
在C / C ++本机代码中,如果您希望代码可移植,则会遇到问题。但是原始文章为您提供了帮助您解决问题的链接。
在计算中,JVM使用RAX还是EAX寄存器?
Java语言规范要求 long
具有64位(不少于,不多)表示,并且所有long op long
算术至少执行64位精度要求所有平台上的答案都是一样的。
实际实施取决于平台。 JVM / JIT编译器(很可能)将选择对当前平台最有效的寄存器和指令。
请记住,在32位Windows Intel平台上运行的JVM与64位Windows Intel平台或Solaris,ARM等的JVM不同。对于其中许多平台,没有称为RAX和EAX的寄存器。
但是如果你真的需要知道,请查看源代码,或使用JVM选项转储JIT编译器发出的本机代码。