我读到JVM将布尔值表示为4字节(int)。 我的问题是 - Java是强类型的 - 并且不允许转换为int。 据我所知,JVM用于根据Java的规范(?)运行代码,因此如果用C ++编写的3 + true编译为字节代码,那么它是合法的。
我错过了什么?
答案 0 :(得分:2)
您的理解“JVM用于根据Java的规范运行代码”是错误的。
有两个不同的规范
Java虚拟机只知道Java编程语言,只知道特定的二进制格式
class
文件格式。class
文件包含Java虚拟机指令(或字节码)和符号表,以及其他辅助信息。
因此,在将Java虚拟机的Java编程语言的源代码编译为执行环境时,Java编译器可能会存在任意差异。
也就是说,“JVM将布尔值表示为4字节(int)”是错误的。你被这个事实误导了,在某些地方,不同类型的物品由同样的指令处理。特别是局部变量,boolean
和int
值由相同的指令处理,但同样适用于byte
,short
,和char
,使用相同的字节码指令同等地处理所有五种类型。
实际上,long
和double
类型由其他指令处理的事实是在设计第一个JVM时简化实现的历史性折衷。每个变量和堆栈条目的类型都可以在每个地方推断出来,因此它也适用于没有任何编码类型信息的通用指令集。
虽然处理局部变量和操作数堆栈的这些指令不区分boolean
,byte
,short
,char
和int
,当涉及方法和字段签名时,JVM区分所有这些类型。在那里,boolean
是专用类型。相反,当涉及到数组时,使用相同的指令处理boolean
数组和byte
数组,这些指令与处理int
数组的指令不同。尽管如此,boolean[]
和byte[]
数组本身也有不同的类型。
这些类型的值的实际存储是否不同,完全取决于特定的JVM实现。