前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >​byte加byte居然是int了?

​byte加byte居然是int了?

原创
作者头像
javadaysdaysup
发布2024-11-07 18:43:54
发布2024-11-07 18:43:54
630
举报

问题现象

最近在看 Java 的基础知识时看到一个有意思的现象,在 Java 中两个 byte 相加之后的结果的类型变成 int 类型了:

代码语言:java
复制
byte a = 1;
byte b = 2;
b = a + b;
image
image

从Idea给的提示可以看到,两个 byte 类型相加的结果变成了 int 类型,不能赋值给一个 byte 类型变量。其实不只是 byte,包括:short、char 等类型执行运算之后的结果也变成 int 类型了,不再是参与运算之前的类型。

如果想要上述代码能够正常编译和运行,可以修改为如下的写法:

代码语言:java
复制
// 写法一
byte a = 1;
byte b = 2;
b = (byte) (a + b);

// 写法二(这种写法是上面写法的一种简化写法,具体可以见:https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.26.2
byte a = 1;
byte b = 2;
b += a;

问题原理

首先根据 Java 语言规范的描述,在执行加法或者减法运算时,会对操作数进行类型提升

image (2)
image (2)

在进行类型提升的时候,byte、short、char 类型都会提升为int类型,由于两个数都提升为了 int 类型,它们执行的运算结果自然而然也就是 int 类型的了。

image (3)
image (3)

在 JVM 的操作数栈的一个单位长度是 32 位,因此为了把参与运算的数放到操作数栈中就必须对其进行扩展,同时我理解这里也是为了和局部变量表的单位相匹配,局部变量表的基本单位是槽位,一个槽位的宽度也是 32 位。

image (4)
image (4)
image (5)
image (5)

从字节码指令也可以说明这点,JVM 中基本上没有关于 byte 类型运算的字节码指令:

image (6)
image (6)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题现象
  • 问题原理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档