1

我对下面的代码有疑问。代码取自我的编程语言书。

byte x, y, z;
...
/* The values of y and z are coerced into int and int addition is performed */
/* The sum is converted into byte */
x = y + z;

我的问题是为什么 Java 会进行这样的强制。你有什么想法?

提前致谢。

4

3 回答 3

2

为了保持 JVM 指令集简单,它没有为每个整数类型实现加法运算符。具体来说,它不能添加字节。(请参阅JVM 操作列表)这使得 JVM 更简单,并且可能更便携。

于 2014-03-03T17:32:02.857 回答
1

这反映了 java 字节码、jvm、java 虚拟机,在规范中使用 int 将单个字节变量存储在堆栈上。它iadd用于添加两个字节。请参阅jvm 指令集

有人可能会争辩说这有点过度规范:提到参考实现的实现选择。

于 2014-03-03T17:35:07.353 回答
1

在 JVM 中,每个堆栈元素的大小为 32 位。实际的添加是这样的:

  1. 这两个字节作为 32 位值压入堆栈(因此它们是int
  2. 调用该iadd指令,从堆栈中弹出两个值并将它们相加
  3. 结果整数再次被压入堆栈

这就是为什么您必须再次将结果值(类型int)转换为 a 的原因byte

于 2014-03-03T17:38:49.527 回答