java中byte类型相加超出范围变负数解析
java中byte类型相加超出范围变负数解析
例:
@Test
public void t() {
byte b=127;
b+=127;
System.out.println(b);
}
最终运行得出的结果时 -2
源码解析:
public void t();
Code:
0: bipush 127 //将单字节的常量值(-128~127)推送至栈顶
2: istore_1 //将栈顶int型数值存入第二个本地变量
3: iload_1 //将第二个int型本地变量推送至栈顶
4: bipush 127 //将单字节的常量值(-128~127)推送至栈顶
6: iadd //将栈顶两int型数值相加并将结果压入栈顶
7: i2b //将栈顶int型数值强制转换成byte型数值并将结果压入栈顶
8: istore_1 //将栈顶int型数值存入第二个本地变量
9: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
12: iload_1
13: invokevirtual #8 // Method java/io/PrintStream.println:(I)V
16: return
第9个指令后面的指令就不一一解释了
从第七个指令中可以清楚的看到,java帮我们将两个int类型的值的运算结果强转成了byte。
java中int类型的变量占4个字节共32位,byte类型占1个字节共8位。java在进行把int强制转换成byte的时候会忽略前24位字节,直接取后面8位。
另外运算器在运算中使用的是反码参与运算。
127+127=254,所对应的二进制为:00000000 00000000 00000000 11111110
取后8位:11111110
即运算后的结果为 11111110,因为运算时是使用的反码运算,那么就需要求出他的源码:即为 10000010
转换为10进制就是 -2
已知反码求真值请参考:http://www.jiajiajia.club/blog/artical/176
评论区
请写下您的评论...
猜你喜欢
ofc
mysql整数类型的范围
weblog
1238
mysql整数类型的范围MySQL支持多种数据类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。其中,整数类型包括:TINYINT、SMALLINT、MEDIUMINT、INT和
blog
java数据类型
java基础
4467
java数据类型java数据类型基本数据类型数值型整数类型(byte,short,int,long)浮点类型(float,double)字符型(chart)布尔型(boolean)引用类型类
blog
java类加载器理解
java虚拟机(jvm)
5368
类加载器Java类加载器(英语:JavaClassloader)是Java运行时环境(JavaRuntimeEnvironment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。类通
ofc
c#中的数据类型
weblog
3250
值类型变量可以直接分配给一个值。它们是从类System.ValueType中派生的。
值类型直接包含数据。比如int、char、float,它们分别存储数字、字符、浮点数。当您声明一个int类型时,系
blog
算法-数列求值
数据结构与算法
9803
问题描述思路:斐波那契数列的变体考虑如果把20190324项的每一项的值都算出来的话,那么值的范围就会超出基本数据类型能够表示的范围,又考虑到题目是求最后四位数,而加法计算时前一位不会影响后一位的计
blog
jvm内存模型分析-类和类加载器
java虚拟机(jvm)
5768
类加载器类加载器虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码
blog
Java内存区域与内存溢出异常
java基础
3751
专门讲述,而“栈”通常就是指这里讲的虚拟机栈,或者更多的情况下只是指虚拟机栈中局部变量表部分。 局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char
blog
java类是如何加载的
java虚拟机(jvm)
4241
首先要知道类的加载的过程包括了加载、验证、准备、解析、初始化五个阶段。java虚拟机加载class的过程虚拟机把Class文件加载到内存,然后进行校验,解析和初始化,最终形成java类型,这就是虚拟
最新发表
归档
2018-11
12
2018-12
33
2019-01
28
2019-02
28
2019-03
32
2019-04
27
2019-05
33
2019-06
6
2019-07
12
2019-08
12
2019-09
21
2019-10
8
2019-11
15
2019-12
25
2020-01
9
2020-02
5
2020-03
16
2020-04
4
2020-06
1
2020-07
7
2020-08
13
2020-09
9
2020-10
5
2020-12
3
2021-01
1
2021-02
5
2021-03
7
2021-04
4
2021-05
4
2021-06
1
2021-07
7
2021-08
2
2021-09
8
2021-10
9
2021-11
16
2021-12
14
2022-01
7
2022-05
1
2022-08
3
2022-09
2
2022-10
2
2022-12
5
2023-01
3
2023-02
1
2023-03
4
2023-04
2
2023-06
3
2023-07
4
2023-08
1
2023-10
1
2024-02
1
2024-03
1
2024-04
1
2024-08
1
标签
算法基础
linux
前端
c++
数据结构
框架
数据库
计算机基础
储备知识
java基础
ASM
其他
深入理解java虚拟机
nginx
git
消息中间件
搜索
maven
redis
docker
dubbo
vue
导入导出
软件使用
idea插件
协议
无聊的知识
jenkins
springboot
mqtt协议
keepalived
minio
mysql
ensp
网络基础
xxl-job
rabbitmq
haproxy
srs
音视频
webrtc
javascript
加密算法
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。