如果boolean在JVM中表示为int,那么它与强类型的Java如何对应?

时间:2016-12-12 18:00:50

标签: java jvm bytecode

我读到JVM将布尔值表示为4字节(int)。 我的问题是 - Java是强类型的 - 并且不允许转换为int。 据我所知,JVM用于根据Java的规范(?)运行代码,因此如果用C ++编写的3 + true编译为字节代码,那么它是合法的。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您的理解“JVM用于根据Java的规范运行代码”是错误的。

有两个不同的规范

  1. The Java® Language Specification,描述了Java编程语言的语义和行为。它通常用于创建在JVM中运行的软件,但这不是严格的要求。
  2. The Java® Virtual Machine Specification描述了JavaVirtual Machine,这是一种特定的执行环境,它被设计为方便用作用Java编程语言编写的软件的目标平台,但不限于此用途。
  3. 这在JVM Spec §1.2

    中得到澄清
      

    Java虚拟机只知道Java编程语言,只知道特定的二进制格式class文件格式。 class文件包含Java虚拟机指令(或字节码)和符号表,以及其他辅助信息。

    因此,在将Java虚拟机的Java编程语言的源代码编译为执行环境时,Java编译器可能会存在任意差异。

    也就是说,“JVM将布尔值表示为4字节(int)”是错误的。你被这个事实误导了,在某些地方,不同类型的物品由同样的指令处理。特别是局部变量booleanint值由相同的指令处理,但同样适用于byteshort,和char,使用相同的字节码指令同等地处理所有五种类型。

    实际上,longdouble类型由其他指令处理的事实是在设计第一个JVM时简化实现的历史性折衷。每个变量和堆栈条目的类型都可以在每个地方推断出来,因此它也适用于没有任何编码类型信息的通用指令集。

    虽然处理局部变量和操作数堆栈的这些指令不区分booleanbyteshortcharint,当涉及方法和字段签名时,JVM区分所有这些类型。在那里,boolean 专用类型。相反,当涉及到数组时,使用相同的指令处理boolean数组和byte数组,这些指令与处理int数组的指令不同。尽管如此,boolean[]byte[]数组本身也有不同的类型。

    这些类型的值的实际存储是否不同,完全取决于特定的JVM实现。