1

我在 64 位编译器上执行了一个 java 程序,并为该程序生成了字节码。是否可以在 32 位编译器上运行相同的字节码而不会丢失数据?

在我的程序中,我x=10024在 64 位编译器上声明了一个变量?
那么在 32 位编译器中 x 的值是多少呢?如果 x 的值相同,如何不丢失数据?你能详细说明一下吗?

4

7 回答 7

7

当您运行“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 来运行编译器。

于 2013-01-02T13:24:42.350 回答
6

JVM 保证字节码运行良好,无论架构如何,无论是 64 位还是 32 位,无论是小端还是大端。在 Java 字节码中:

  • 所有原始类型的大小相同;
  • 都是大端。

之后,JVM可能会,也可能不会,在运行时将字节码优化为本地代码(并在场景之外执行必要的字节序魔法)。

如果您愿意,可以将字节码视为“Java 汇编语言”——但对于所有 CPU 架构只有一种这样的汇编语言:“运行”该汇编语言是 JVM 的角色。

于 2013-01-02T13:24:09.307 回答
2

Java 编译器生成的字节码不依赖于物理机的架构。Java 虚拟机可以运行此字节码,无论其架构是否与编译代码的机器的架构相同。

Java 整数类型是 4 个字节。在 32、64 或 128 位机器上。Java long 类型是 8 个字节。等等等等。

于 2013-01-02T13:24:23.763 回答
1

是的,无论您的平台值如何,原始变量的值都将保持不变。除浮点数据类型外,精度取决于您是否指定 strictfp。

来自 Java 语言规范:Strictfp 确保您从每个平台上的浮点计算中获得完全相同的结果。如果您不使用 strictfp,JVM 实现可以在可用的情况下免费使用额外的精度

于 2013-01-02T13:25:15.210 回答
1

fge 是正确的。

更详细:Java 确保 int 在 BigEndian 中有 4 个字节 float 在 BigEndian 中有 4 个字节 long 在 BE 中有 8 个字节,依此类推......

无论底层架构如何,这都会保持不变,因此在 8 位机器上使用 long 会严重减慢速度,因为它必须在 8x8 位上工作一个 long。

但是,特定于平台和架构的 JVM 将尝试尽可能优化它。

于 2013-01-02T13:28:33.177 回答
1

生成的字节码与平台无关。如果您在 32 位或 64 位机器上运行相同的字节码,则没有任何区别。在大多数情况下的行为应该完全相同。

除非您有本机代码(为特定架构编译的机器代码),否则您的代码将在 32 位和 64 位 JVM 中同样运行良好,即它与平台无关

x = 10024 

int 变量 x 在两种架构中都表示为 32 位定点值,因此不会有任何损失或意外行为

于 2013-01-02T13:36:31.200 回答
0

Java 在可以执行代码的 Java 虚拟机 (JVM) 中运行。JVM 提供了一个运行时环境,可以在其中执行 Java 字节码,支持自动异常处理等功能,它为每个软件错误(异常)提供根本原因调试信息。JVM 与 Java 类库一起分发,Java 类库是一组实现 Java 应用程序编程接口 (API) 的标准类库(Java 字节码)。这些库与 JVM 捆绑在一起,形成了 Java 运行时环境 (JRE)。JVM 可用于许多硬件和软件平台。对所有平台上的所有 JVM 使用相同的字节码允许将 Java 描述为一种编写一次、随处运行的编程语言,而不是一次编写、随处编译的编程语言,后者描述了跨平台编译语言。因此,JVM 是 Java 平台的重要组成部分。JVM 通常被实现为在现有操作系统上运行,但也可以被实现为直接在硬件上运行。如果您愿意,可以自己制作,允许您将 java 移植到任何地方。来源:维基百科

于 2013-01-02T13:26:13.747 回答