将一个字节值转换为整数

3

我知道,如果我们在byte值上执行算术运算,则会隐式地将其提升为int,并且结果将是int,因此我们需要显式地将其转换为byte才能将结果存储在byte变量中。

但我想问:

  • 将byte转换为int是在声明时发生还是在使用它进行算术运算时发生?因为我正在使用的Java反编译器将其从byte转换为int,所以这是否是反编译器的问题还是真的是这样。
  • 如果确实发生在声明时,那么为什么存储超出byte范围的值会显示错误?

例如- 代码如下:

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

    }
}

反编译输出- 点击查看


它是在编译时计算的。 - Maroun
3个回答

5

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

JVM虚拟机实现将单个字节(而不是字节数组)作为变量存储在int插槽中。并使用int操作码进行算术运算。

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


3
在Java中,隐式类型转换是一种编译时机制。因此,它会显示超出范围等错误。以下是关于这个主题的一个很好的SO答案:Runtime vs Compile time

1
链接的主题没有提到类型转换,我认为你没有恰当地回答了这个问题,所以我给你点了踩。你怎么知道隐式类型转换发生在编译时? - Rainbolt

0

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

摘自infoq文章

当将一个值加载到操作数栈上时,JVM会将比整数小的原始类型(如short或byte)视为整数。因此,如果方法变量由short而不是int表示,对程序的字节码表示几乎没有什么影响。相反,Java编译器插入了额外的字节码指令来裁剪值以符合允许的短整型范围。在方法体中使用short而不是int可能会导致额外的字节码指令,而不是优化程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接