首页
编程随笔
Java笔记
Html/Css/Js
Android
后端笔记
服务器搭建
BUG收集
Java异常
Android异常
在线工具
Json格式化
编码/解码
Epub在线编辑
登录
发布文章
个人文章
退出登录
首页
技术教程
BUG收集
在线工具
资源下载
登录
发布文章
退出登录
搜索
当前位置:
首页
-
博客
- 正文
关闭
a = a + b与a += b有什么区别吗?并从字节码上查看a += b的执行过程
更新时间:2024-03-23 10:38:11
阅读数:1320
发布者:落幕
###1、使用‘+’的情况下 首先我们先看java中’+’的特点:在编译器’+’将右边的表达式结果计算出来后,和左边的变量类型比较精度,如果左边的变量精度低于右边的结果的精度,编译器会显式的报错,告诉程序员去强制转型。 ```java // byte取值范围-128~127没超出范围运行正常 byte a = 126 + 1; ``` ```java // byte取值范围-128~127超出范围出现异常:Type mismatch: cannot convert from int to byte byte a = 127 + 1; ``` 因为Java整形中默认的是int类型(byte、short、int、boolean都是使用int存储),所以无论是126,127,1,这些都是int类型: 那么126+1得到的是127,而127满足byte类型的范围,所以可以直接赋值,会给右边的int类型做默认的强转 而127+1得到128,128已经不满足byte类型的范围了,无法把int类型赋值给byte类型,无法做默认强转,这时就要报错了 ### 2、两个bye类型变量相加 ```java byte a = 1; byte b = 1; a = a + b; // 报错Type mismatch: cannot convert from int to byte a += b; // 可以正常运行 ``` a和b是变量,意味着这两值不确定、可能随时变化,编译器无法检查具体的值,也无法确定是否在byte字节范围之内, 他检查不了就会报错(可能丢失精度); 所有当编译器无法确定时,就要求你强制转换来解决问题。 ```java a = (byte) a + b; ``` ### 为什么a += b运行正常 Java代码 ```java byte a = 127; byte b = 0; b += a; ``` 使用bytecode查看字节码 ```java 0 bipush 127 // 压入一个常量127到操作数栈 2 istore_1 // 存储到局部变量表1号位(0号位置是this)即赋值给变量a 3 iconst_0 // 压入一个常量0到操作数栈 4 istore_2 // 存储到局部变量表2号位即赋值给变量b 5 iload_2 // 存储到局部变量表2号位 6 iload_1 // 存储到局部变量表1号位 7 iadd // 相加 8 i2b // 把int类型的数据转化为byte类型 9 istore_2 // 存储到局部变量表2号位即赋值给变量b 10 return // 返回空 ```