Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果boolean在JVM中表示为int,那么它如何与强类型Java相对应?_Java_Jvm_Bytecode - Fatal编程技术网

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

如果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将布尔值表示为4字节(int)。 我的问题是-Java是强类型的-不允许转换为int。 据我了解,JVM是用来将代码对应于java的规格(?),所以如果C++中的3 +真的被编译成字节码,它是合法的。
我遗漏了什么?

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

有两种不同的规范

  • 它描述了Java编程语言的语义和行为。它通常用于创建在JVM中运行的软件,但这不是严格的要求
  • 描述Java虚拟机,一种特定的执行环境,它被设计为方便使用Java编程语言编写的软件的目标平台,但不限于此用途
  • 这一点在以下文件中得到了澄清:

    Java虚拟机对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的实现。它在任何方面都不等同于Java
    int
    值。JVM可以将其存储为位、字节、字、dword或它想要的任何其他形式。例如,单<代码>布尔< /COD>可能是DWORD,但布尔数组可能是字节或位。是否编译C++到JVM字节码?如果答案是肯定的,那么询问编译器的供应商他们如何处理booleanHere的JVM规范,据说boolean表示为0和1。@NatanZB没有说明将
    boolean
    存储为
    int
    ,它只是说
    true
    存储为
    1
    ,而
    false
    存储为
    0
    ,任何允许将
    boolean
    强制为
    int
    的语言编译器都应该这样进行转换。存储仍然可以是位、字节、字、dword…这些都是无关的。实现语言或ts类型系统不必是强类型的。您可以完全用汇编语言实现它。Java语言是强类型的,这得益于编译器和JVM实现的规则。