[英]If boolean is represented as int in the JVM, how does it correspond with Java being strongly-typed?
我读到JVM将布尔值表示为4字节(int)。 我的问题是-Java是强类型的-不允许转换为int。 据我了解,JVM用于根据Java规范(?)来运行代码,因此,如果将用C ++编写的3 + true编译为字节码,则是合法的。
我想念什么?
您的理解“ JVM用于根据Java规范运行代码”是错误的。
有两种不同的规格
这在JVM Spec§1.2中得到了澄清:
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实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.