将字节值转换为int

时间:2015-08-26 13:55:57

标签: java compiler-construction int byte

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

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

EG- 代码是 -

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

    }
}

反编译器的输出 - Check this

3 个答案:

答案 0 :(得分:5)

字节仍然是一个字节,并且由编译器静态输入。

JVM machine实现在int槽中保存单个字节(而不是字节数组)作为变量。并使用int opcodes进行算术。

编译器也会为一个字节分配一个final int常量,只要它在-128,... 127的字节范围内。

答案 1 :(得分:3)

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

Runtime vs Compile time

答案 2 :(得分:0)

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

取自infoq article

  

将值加载到操作数堆栈时,JVM会处理原语   小于整数的类型,就好像它们是整数一样。   因此,它对程序的字节码几乎没有影响   表示方法变量是否由例如a表示   短而不是int。相反,Java编译器会插入其他内容   字节码指令,用于将值裁剪到a的允许范围内   分配值时很短。在方法中使用整数短路   因此,主体可以产生额外的字节码指令   而不是大概优化程序。