如果boolean在JVM中表示为int,那么它如何与强类型Java相对应?
我读到JVM将布尔值表示为4字节(int)。 我的问题是-Java是强类型的-不允许转换为int。 据我了解,JVM是用来将代码对应于java的规格(?),所以如果C++中的3 +真的被编译成字节码,它是合法的。如果boolean在JVM中表示为int,那么它如何与强类型Java相对应?,java,jvm,bytecode,Java,Jvm,Bytecode,我读到JVM将布尔值表示为4字节(int)。 我的问题是-Java是强类型的-不允许转换为int。 据我了解,JVM是用来将代码对应于java的规格(?),所以如果C++中的3 +真的被编译成字节码,它是合法的。 我遗漏了什么?您对“JVM用于根据Java规范运行代码”的理解是错误的 有两种不同的规范 它描述了Java编程语言的语义和行为。它通常用于创建在JVM中运行的软件,但这不是严格的要求 描述Java虚拟机,一种特定的执行环境,它被设计为方便使用Java编程语言编写的软件的目标平台,但不限
我遗漏了什么?您对“JVM用于根据Java规范运行代码”的理解是错误的 有两种不同的规范
类
文件格式。class
文件包含Java虚拟机指令(或字节码)和符号表以及其他辅助信息
因此,在编译以Java虚拟机为执行环境的Java编程语言的源代码时,Java编译器必须考虑到任意差异
也就是说,说“JVM将布尔值表示为4字节(int)”是错误的。在某些地方,不同类型的项目由相同的指令处理,这一事实误导了您。特别是对于局部变量,
boolean
和int
值由相同的指令处理,然而,这同样适用于byte
、short
和char
,所有五种类型都使用相同的字节码指令进行同等处理
实际上,long
和double
类型是由其他指令处理的,这是在设计第一个JVM时简化实现的历史折衷。每个变量和堆栈项的类型都可以在每个位置推断出来,因此它也可以使用没有任何编码类型信息的通用指令集
虽然这些处理局部变量和操作数堆栈的指令不区分布尔
、字节
、短
、字符
和int
,但JVM在方法和字段签名方面区分了所有这些类型。其中,boolean
是一种专用类型。相反,对于数组,boolean
数组和byte
数组使用相同的指令进行处理,这与处理int
数组的指令不同。不过,布尔[]
和字节[]
数组本身有一种不同的类型
这些类型的值的实际存储是否不同,完全取决于特定的JVM实现。不知道您读到了什么,但是
布尔值是真值
/假值
值,并且这种值的内部存储完全取决于JVM的实现。它在任何方面都不等同于Javaint
值。JVM可以将其存储为位、字节、字、dword或它想要的任何其他形式。例如,单<代码>布尔< /COD>可能是DWORD,但布尔数组可能是字节或位。是否编译C++到JVM字节码?如果答案是肯定的,那么询问编译器的供应商他们如何处理booleanHere的JVM规范,据说boolean表示为0和1。@NatanZB没有说明将boolean
存储为int
,它只是说true
存储为1
,而false
存储为0
,任何允许将boolean
强制为int
的语言编译器都应该这样进行转换。存储仍然可以是位、字节、字、dword…这些都是无关的。实现语言或ts类型系统不必是强类型的。您可以完全用汇编语言实现它。Java语言是强类型的,这得益于编译器和JVM实现的规则。