我在 64 位编译器上执行了一个 java 程序,并为该程序生成了字节码。是否可以在 32 位编译器上运行相同的字节码而不会丢失数据?
在我的程序中,我x=10024
在 64 位编译器上声明了一个变量?
那么在 32 位编译器中 x 的值是多少呢?如果 x 的值相同,如何不丢失数据?你能详细说明一下吗?
当您运行“32 位”编译器时,您在 32 位 JVM 中运行编译器代码,而当您运行“64 位”编译器时,您在 64 位 JVM 中运行完全相同的代码,这将产生完全相同的字节码。如果字节码不完全相同,则您发现了一个错误。唯一的区别是“64 位”版本的运行速度可能会稍微快一些(猜测可能高达 5%)
我在 64 位编译器上执行了一个 java 程序
您在编译器中编译字节码,而不是运行它。
并为该程序生成字节码。
字节码不是 32 位或 64 位,您如何创建它或在哪个 JVM 中运行编译器都没有区别。
是否可以在 32 位编译器上运行相同的字节码而不会丢失数据?
无论是 32 位还是 64 位,您都可以使用由任何版本的 Java 编译的类编译代码,直到相同版本。
在我的程序中,我在 64 位编译器上声明了一个变量 x=10024?
这没有任何意义。您可能已经编译过代码,例如int x=10024;
使用在 64 位 JVM 中运行的编译器。它是如何编译的没有任何区别。
那么在 32 位编译器中 x 的值是多少呢?
与在 32 位 JVM 或任何其他 JVM 中运行的编译器相同。
如果 x 的值相同,如何不丢失数据?
没有理由丢失数据。如果x
是一个int
,它将是一个 32 位有符号值,无论您如何编译代码或使用哪个 JVM 来运行编译器。
JVM 保证字节码运行良好,无论架构如何,无论是 64 位还是 32 位,无论是小端还是大端。在 Java 字节码中:
之后,JVM可能会,也可能不会,在运行时将字节码优化为本地代码(并在场景之外执行必要的字节序魔法)。
如果您愿意,可以将字节码视为“Java 汇编语言”——但对于所有 CPU 架构只有一种这样的汇编语言:“运行”该汇编语言是 JVM 的角色。
Java 编译器生成的字节码不依赖于物理机的架构。Java 虚拟机可以运行此字节码,无论其架构是否与编译代码的机器的架构相同。
Java 整数类型是 4 个字节。在 32、64 或 128 位机器上。Java long 类型是 8 个字节。等等等等。
是的,无论您的平台值如何,原始变量的值都将保持不变。除浮点数据类型外,精度取决于您是否指定 strictfp。
来自 Java 语言规范:Strictfp 确保您从每个平台上的浮点计算中获得完全相同的结果。如果您不使用 strictfp,JVM 实现可以在可用的情况下免费使用额外的精度
fge 是正确的。
更详细:Java 确保 int 在 BigEndian 中有 4 个字节 float 在 BigEndian 中有 4 个字节 long 在 BE 中有 8 个字节,依此类推......
无论底层架构如何,这都会保持不变,因此在 8 位机器上使用 long 会严重减慢速度,因为它必须在 8x8 位上工作一个 long。
但是,特定于平台和架构的 JVM 将尝试尽可能优化它。
生成的字节码与平台无关。如果您在 32 位或 64 位机器上运行相同的字节码,则没有任何区别。在大多数情况下的行为应该完全相同。
除非您有本机代码(为特定架构编译的机器代码),否则您的代码将在 32 位和 64 位 JVM 中同样运行良好,即它与平台无关
x = 10024
int 变量 x 在两种架构中都表示为 32 位定点值,因此不会有任何损失或意外行为
Java 在可以执行代码的 Java 虚拟机 (JVM) 中运行。JVM 提供了一个运行时环境,可以在其中执行 Java 字节码,支持自动异常处理等功能,它为每个软件错误(异常)提供根本原因调试信息。JVM 与 Java 类库一起分发,Java 类库是一组实现 Java 应用程序编程接口 (API) 的标准类库(Java 字节码)。这些库与 JVM 捆绑在一起,形成了 Java 运行时环境 (JRE)。JVM 可用于许多硬件和软件平台。对所有平台上的所有 JVM 使用相同的字节码允许将 Java 描述为一种编写一次、随处运行的编程语言,而不是一次编写、随处编译的编程语言,后者描述了跨平台编译语言。因此,JVM 是 Java 平台的重要组成部分。JVM 通常被实现为在现有操作系统上运行,但也可以被实现为直接在硬件上运行。如果您愿意,可以自己制作,允许您将 java 移植到任何地方。来源:维基百科