繁体   English   中英

如果布尔值在JVM中表示为int,那么它与强类型的Java相对应?

[英]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规范运行代码”是错误的。

有两种不同的规格

  1. Java语言规范 ,描述Java编程语言的语义和行为。 它通常用于创建在JVM中运行的软件,但这不是严格的要求。
  2. Java®虚拟机规范描述了JavaVirtual Machine,它是一种特定的执行环境,其设计目的是方便用作Java编程语言编写的软件的目标平台,但不限于此。

这在JVM Spec§1.2中得到了澄清:

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

因此,当编译针对Java虚拟机作为执行环境的Java编程语言的源代码时,Java编译器必须具有任意的差异。


也就是说,说“ JVM将布尔值表示为4字节(int)”是错误的。 您被以下事实误导了:在某些地方,不同类型的项目由相同的指令处理。 特别是对于局部变量booleanint值由相同的指令处理,但是, byteshortchar ,这五种类型均使用相同的字节码指令平等地处理。

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

尽管这些处理局部变量和操作数堆栈的指令在booleanbyteshortcharint之间没有区别,但在方法和字段签名方面,JVM却在所有这些类型之间进行了区别。 在那里, boolean 专用类型。 相反,对于数组, boolean数组和byte数组使用相同的指令来处理,这与处理int数组的指令不同。 仍然, boolean[]byte[]数组本身具有不同的类型。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM