首页 > 其他分享 >深入虚拟机笔记之整数运算

深入虚拟机笔记之整数运算

时间:2023-05-29 12:38:01浏览次数:43  
标签:运算 笔记 int 虚拟机 long 整数 类型 压入


第12章 整数运算

 

    二进制补码运算:java虚拟机支持的所有整数类型:byte、short、int、long,它们都是带符号的二进制补码数。在一个二进制补码数中,最重要的位是它的符号位(最高位),0表示正整数和0,1表示负整数。

    能够被二进制补码表示的数值范围为:2的总位数的次幂。其中一半是0和正整数,一半是负整数。

    在带符号二进制补码数上进行的加法运算与在无符号二进制数上进行的加法运算一样。两个数相加(忽略最高位的溢出),结果被解释为一个带符号的二进制补码数。java虚拟机中出现的整数运算的溢出并不会导致抛出异常,其结果只被简单地截短以符合数据类型(int类型或者long类型)。在java编程中,必须随时注意可能发生的溢出,确认所选择的数据类型是否正确。整数被0除时会抛出一个ArithmeticException异常。

    如果long类型的长度仍然不能满足需要,可以使用java.math包中的BigInteger类,这个类的实例可以描述任意长度的整数。BigInteger类支持在任意长度整数上进行的所有数学运算,前提是这些运算是基于java虚拟机和java.lang.Math包所支持的基本类型的。

 

    运算操作码:java虚拟机提供几种进行整数算术运算的操作码,它们执行基于int和long类型的运算。

    整数加法:整数加法可以在int和long类型上进行,弹出栈顶部的两个值,相加,把结果压入栈。必须有指令先把两个相加的整数压入栈中,值的类型由操作码自己决定,最后得到的结果总是与相加的成员具有同样的类型。加法操作码不会导致任何异常抛出,溢出在这里通常被忽略。

深入虚拟机笔记之整数运算_入栈

   iinc操作码对int类型局部变量执行加法操作,操作码之后的第2个字节被解释为一个8位的二进制补码数。局部变量和8位带符号值相加,结果被写回局部变量。

 

深入虚拟机笔记之整数运算_运维_02


    整数减法:执行int和long类型的减法运算,从栈顶弹出两个相同类型的值,顶端的值充当减数,底端的值充当被减数(底端的值 - 顶端的值),进行减法运算,结果被压入栈。此类操作不会导致抛出异常。

深入虚拟机笔记之整数运算_运维_03

    整数乘法:执行int和long类型的乘法运算,从栈顶弹出两个相同类型的值并相乘,结果被压入栈。此类操作不会导致异常抛出。 

深入虚拟机笔记之整数运算_java_04


    整数除法:执行int和long类型的除法运算,从栈顶弹出两个相同类型的值,底端的数除以顶端的数(栈顶部的数作为除数或者分母,底端的值 / 顶端的值),结果被压入栈。对于整数除法所产生的结果将今夕取整操作;如果整数被0除(栈顶的值为0),则抛出ArithmeticException异常。


    整数取余:执行int和long类型的取余运算,从栈顶弹出两个相同类型的值,底端的数除以顶端的数(栈顶部的数作为除数或者分母,底端的值 % 顶端的值),除法的余数被压入栈。如果整数被0除(栈顶的值为0),则抛出ArithmeticException异常。

深入虚拟机笔记之整数运算_补码_05


    整数取反:执行int和long类型的取反运算,弹出栈顶部的值,取反,结果被压入栈。此类操作不会导致异常抛出。 

深入虚拟机笔记之整数运算_操作码_06


 

 

 

 

 

 

 

 

 

标签:运算,笔记,int,虚拟机,long,整数,类型,压入
From: https://blog.51cto.com/u_16131764/6370056

相关文章

  • java二进制运算
    //对于原码,反码,补码而言,需要注意以下几点://(1) 二进制的最高位是符号位,0表示正数,1表示负数;//(2) 正数的原码,反码,补码都一样;//(3) 负数的原码=对应正数的二进制原码,最高位设为1;//(4) 负数的反码=它的原码符号位不变,其他位取反;//(5) 负数的补码=它的......
  • 压栈思想计算Java运算表达式
         栈的规则是先进后出。利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字、一个用来存放对应的操作符。假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符、或者就是括号了。然后我们......
  • java虚拟机总结
     类型的生命周期:java虚拟机通过装载、连接和初始化一个java类型,使该类型可以被正在运行的java程序所使用。装载:是把二进制形式的java类型读入java虚拟机中。连接:是把读入的二进制形式的类型数据合并到虚拟机的运行时状态中去。连接分三个子步骤(验证、准      备和解析......
  • 开发 Java笔记
    1.Controller@RequestMapping注解用于绑定URI到具体处理器。@RestController:Spring4新增注解,同样可以注解Controller类,相当于@Controller+@ResponseBody,主要是为了使http请求返回 json 或者xml格式数据,一般情况下都是使用这个注解。下文都基于此注解进行验证。用于将......
  • Qt+QtWebApp开发笔记(四):http服务器使用Session和Cookie实现用户密码登录和注销功能
    前言  前面实现了基础的跳转,那么动态交互中登录是常用功能。  本篇实现一个动态交互的简单登录和注销功能,在Qt中使用Session和Cookie技术。 Demo  下载地址  链接:https://pan.baidu.com/s/1nkmsHgr-11Khe9k6Ntyf_g?pwd=1234 Html处理用户输入Sessi......
  • ctfshow刷题笔记-misc入门
    ctfshow-misc入门图片篇(文件结构)misc241.在010Editor中打开文件,根据鼠标自动提示找到图片宽高对应的地方biWidth指定图象的宽度,单位是象素。biHeight指定图象的高度,单位是象素。2.修改图片高度为250px并另存3.打开后得到flagmisc251.从网上找到的脚本(将脚本和图片......
  • 07-定点运算
    07-定点运算加减法运算补码加减法运算的公式加法整数$[A]_补+[B]_补=[A+B]_补(mod2^{n+1})$小数$[A]_补+[B]_补=[A+B]_补(mod2)$减法整数$[A-B]_补=[A+(-B)]_补=[A]_补+[-B]_补(mod2^{n+1})$小数$[A-B]_补=[A+(-B)]_补=[A]_补+[-B]_补(mod2)$溢出判断举例......
  • 1.4. 运算符与表达式
    在Java中,运算符是用于执行特定操作的符号,而表达式是由变量、常量和运算符组成的一段代码,用于计算值。本节将介绍Java中的常用运算符和表达式的使用。1.4.1.算术运算符Java支持以下算术运算符:加法(+)减法(-)乘法(*)除法(/)取模(求余数)(%)示例代码:inta=10;intb=20;in......
  • Golang入门笔记
    第一个Go程序packagemain //包,表明代码所在的模块(包)import"fmt" //引入代码依赖//功能实现funcmain(){ fmt.Println("HelloWorld");}编译执行➜go-examplegit:(master)✗cdsrc/example/main➜maingit:(master)✗lshello_world.go➜maingit:......
  • 1.4. 运算符与表达式
    在Java中,运算符是用于执行特定操作的符号,而表达式是由变量、常量和运算符组成的一段代码,用于计算值。本节将介绍Java中的常用运算符和表达式的使用。1.4.1.算术运算符Java支持以下算术运算符:加法(+)减法(-)乘法(*)除法(/)取模(求余数)(%)示例代码:inta=10;intb=20;int......