【问题标题】:Conversion of a byte value into an int将字节值转换为 int
【发布时间】:2015-08-26 13:55:57
【问题描述】:

我知道,如果我们对字节值执行算术运算,那么它会隐式提升为 int 并且结果将是 int,因此我们需要将其显式转换为 byte 以便将结果存储在字节变量。 但我想问-

  • 从 byte 到 int 的转换是否发生在 当我们在算术中使用它时被声明或发生 手术?因为我使用的java反编译器将它从 声明时将字节转换为int。所以,它是反编译器吗 问题还是真的如此。
  • 如果真的发生在申报时,那为什么要存储 超出字节范围的值显示错误?

例如- 代码是-

public class Hello
{
    public static void main(String[] args)
    {
        byte a=90;

    }
}

反编译器的输出-

【问题讨论】:

  • 编译时计算。

标签: java compiler-construction int byte


【解决方案1】:

一个字节仍然是一个字节,并且由编译器静态类型化。

JVM machine 实现将单个字节(与字节数组相反)作为变量保存在 int 插槽中。并使用int opcodes 进行算术运算。

同时将final int 常量分配给一个字节将由编译器完成,只要它在字节范围 -128, ... 127 内。

【讨论】:

    【解决方案2】:

    Java 中的隐式类型转换是一种编译时机制。所以是的,它会显示错误,例如超出范围的值。这是关于这个主题的一个很好的答案:

    Runtime vs Compile time

    【讨论】:

    • 链接的主题没有提到类型转换,我不认为你做这个问题是正义的,所以我投了反对票。你怎么知道隐式类型转换发生在编译时?
    【解决方案3】:

    如果在范围内,编译器会将堆栈上声明的任何值裁剪为整数。

    取自infoq article

    当将一个值加载到操作数堆栈上时,JVM 将原始 小于整数的类型,就好像它们是整数一样。 因此,它对程序的字节码几乎没有影响 表示如果方法变量由例如 短而不是 int。相反,Java 编译器插入了额外的 将值裁剪到允许范围的字节码指令 赋值时很短。在方法的整数中使用shorts 因此 body 可以产生额外的字节码指令 而不是优化程序。

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 2011-09-04
      相关资源
      最近更新 更多