java中byte类型相加超出范围变负数解析

硅谷探秘者 4904 0 0

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


评论区
请写下您的评论...
暂无评论...
猜你喜欢
weblog 998 mysql整MySQL支持多种,大致可以分为三值、日期/时间和字符串(字符)。其,整包括:TINYINT、SMALLINT、MEDIUMINT、INT和
java基础 4173 javajava基本byte,short,int,long)浮点(float,double)字符(chart)布尔(boolean)引用
java虚拟机(jvm) 5102 载器Java载器(英语:JavaClassloader)是Java运行时环境(JavaRuntimeEnvironment)的一部分,责动态JavaJava虚拟机的内存空间
weblog 3055 量可以直接分配给一个值。它们是从System.ValueType派生的。 值直接包含据。比如int、char、float,它们分别存储字、字符、浮点。当您声明一个int时,系
数据结构与算法 9552 问题描述思路:斐波那契列的体考虑如果把20190324项的每一项的值都算来的话,那么值的就会基本能够表示的,又考虑到题目是求最后四位,而法计算时前一位不会影响后一位的计
java虚拟机(jvm) 5069 载器载器虚拟机设计团队把载阶段的“通过一个的全限定名来获取描述此的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的。实现这个动作的代码
java基础 3484 专门讲述,而“栈”通常就是指这里讲的虚拟机栈,或者更多的情况下只是指虚拟机栈局部量表部分。  局部量表存放了编译期可知的各种Java虚拟机基本(boolean、byte、char
java虚拟机(jvm) 4056 首先要知道载的过程包括了载、验证、准备、、初始化五个阶段。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
标签
算法基础 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
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。