操作数

14.运算符(operator)

混江龙づ霸主 提交于 2020-01-28 12:31:23
整数运算: 1. 如果两个操作数有一个为Long, 则结果也为long。 2. 没有long时,结果为int。即使操作数全为short,byte,结果也是int。 浮点运算: 3. 如果两个操作数有一个为double,则结果为double。 4. 只有两个操作数都是float,则结果才为float。 取模运算: 1.其操作数可以为浮点数,一般使用整数,结果是“余数”,“余数”符号和左边操作数相同,如:7%3=1,-7%3=-1,7%-3=1。 算术运算符中++,–属于一元运算符,该类运算符只需要一个操作数。 public class TestOperator { public static void main ( String [ ] args ) { int b = 2 ; long b2 = 3 ; float f1 = 3.14F ; float d = b + b2 ; //前者表述范围大于后者时,会自动转换类型,不会报错 //float d2 = f1+6.2; //报错常量6.2默认是double类型 System . out . println ( - 9 % 5 ) ; //“余数”符号和左边操作数相同 int a = 3 ; int B = a ++ ; //执行完后,B=4。先给b赋值,再自增。 System . out . println ( "a=" + a

前缀、中缀、后缀表达式

白昼怎懂夜的黑 提交于 2020-01-27 23:50:54
它们之间的区别在于运算符相对与操作数的位置不同。 将中缀表达式转换为前缀表达式: 遵循以下步骤: (1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2; (2) 从右至左扫描中缀表达式; (3) 遇到操作数时,将其压入S2; (4) 遇到运算符时,比较其与S1栈顶运算符的优先级: (4-1) 如果S1为空,或栈顶运算符为右括号“)”,则直接将此运算符入栈; (4-2) 否则,若优先级比栈顶运算符的较高或相等,也将运算符压入S1; (4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较; (5) 遇到括号时: (5-1) 如果是右括号“)”,则直接压入S1; (5-2) 如果是左括号“(”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到右括号为止,此时将这一对括号丢弃; (6) 重复步骤(2)至(5),直到表达式的最左边; (7) 将S1中剩余的运算符依次弹出并压入S2; (8) 依次弹出S2中的元素并输出,结果即为中缀表达式对应的前缀表达式。 例如,将中缀表达式“1+((2+3)×4)-5”转换为前缀表达式的过程如下: 扫描到的元素 S2(栈底->栈顶) S1 (栈底->栈顶) 说明 5 5 空 数字,直接入栈 - 5 - S1为空,运算符直接入栈 ) 5 - ) 右括号直接入栈 4 5 4 - ) 数字直接入栈 × 5 4 -

关于真分数四则运算算法

99封情书 提交于 2020-01-27 07:54:45
排版有些问题,请谅解。。。 数据结构:下压栈 参考算法:Dijkstra双栈算数表达式求值算法、GCD算法(求最大公约数)、逆波兰表达式 1.Dijkstra双栈算数表达式求值算法: 引自《算法》第四版 作者: 塞奇威克 (Robert Sedgewick) / 韦恩 (Kevin Wayne) 本质:操作数栈 运算符栈 忽略左括号 遇右括号弹出运算符、弹出所需数量操作数、将运算结果压入操作数栈 2.GCD算法: 别名:辗转相除法、欧几里得算法 因为以前写过一个C语言实现,直接po上来吧 #include "stdafx.h" int _GCD(int m, int n); int main(void) { int x, y; int GCD; int a, b; scanf_s("%d/%d", &x, &y); GCD = _GCD(x, y); a = x / GCD; b = y / GCD; printf("%d/%d", a, b); return 0; } int _GCD(int m, int n) { int d; for (;;) { if (n == 0) { break; } else { d = m%n; m = n; n = d; } } return m; } 3.逆波兰表达式 表达式 逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出

常用汇编指令复习

天涯浪子 提交于 2020-01-27 04:43:10
从事 Windows 底层的开发,一定要懂得一定的汇编的语言。其实 Windows 的底层都是使用 C 语言代码编译而成的机器码,再被调试器反汇编成汇编语言代码。对于机器码我们肯定不好理解,这时候汇编语言就成了一个很好的中间媒介。 堆栈相关的常用指令 PUSH: 把一个 32 位的操作数压入堆栈中,这个操作导致 esp 减 4( 我们认为堆栈顶部是地址小的区域 ) ,操作数成为栈顶。 POP: 与 PUSH 指令相反,这个指令是取出栈顶的操作数,导致 esp 加 4 。 SUB: 减法指令,第一个参数是被减数所在的寄存器,第二个参数是减数所在的存储器 ADD: 加法指令,原理同上 RET: 返回指令,相当于跳转回调用函数的地方。 CALL: 调用函数 数据传送指令 MOV: 数据移动,这是最简单的数据传输指令,第一个参数书移动数据的目的地,第二个参数是数据的来源 XOR: 异或,这个本来是一个逻辑运算符,但是 XOR eax , eax 这样的指令常常用来代替 MOV eax , 0 ,好处是速度更快,占用字节更少。 LEA: 取得 ( 后面的操作数 ) 地址后放入前面的存储器中。 STOS: 串存储指令。为了解释这个指令,需要借助一段代码 : Mov ecx, 30h Mov eax,0ccccccch Rep stos dword pt res:[edi]

表达式和运算符

孤街醉人 提交于 2020-01-27 00:05:16
表达式和运算符 表达式 具有一个或多个操作数, 零个或多个运算符, 可以计算且结果为单个值、对象、方法或命名空间的代码片段。 如 i++; 其中 i 为操作数, ++ 为运算符 运算符 按操作数可以分为 一元运算符(++, new) 二元运算符(+, -, *, /) 三元运算符(条件运算符?:, 唯一一个三元运算符) 按操作类型可以分为 类型 符号表示 基本运算符 X.y, f(x), a[x], x++, x--, new, typeof, checked, unchecked, default, delegate 一元运算符 +, -, !, ~, ++x, --x, (T)x 乘除运算符 *, /, % 加减运算符 +, - 移位运算符 <<, >> 关系和类型检测运算符 <, >, <=, >=, is, as 相等运算符 ==, != 逻辑运算符 &, ^, | 条件运算符 &&, ||, ?: 赋值运算符 =, +=, -=, *=, /=, %=, &=, 其优先级从上到下依次增强, 相同优先级情况下, 左结合运算符从左到右顺序计算, 右结合运算符从右到从顺序计算. 在所有运算符当中, 赋值运算符和三元运算符是右结合运算符, 其他所有二元运算符都是左结合运算符. 建议多用括号进行优先级标记. 另一点需要注意的是,相等运算符对于值类型数据的判断

汇编语言指令

拈花ヽ惹草 提交于 2020-01-26 21:26:19
指令助记符 如MOV, SUB这些词分别表示传送, 减法. 汇编源程序时, 系统使用内部对照表将每条指令的助记符翻译成对应的机器码 目的操作数 目的操作数一共有两个作用 参与指令操作 暂时储存操作结果 源操作数 源操作数主要提供原始数据或操作对象, 面向所有寻址方式. 例如, 在指令SUB AX, BX 中 的值作为减数提供给指令SUB 操作符 dup:表示定义重复的数据,和db、dw、dd配合使用,db 3 dup(‘A’)相当于db ‘AAA’。 注释 这是对源程序的说明, 在汇编中用 ; 号, 后面的内容将被注释   介绍指令前, 先熟悉下这些在指令中的符号(必须要记得) imme: 立即数 DST: 目的操作数 SRC: 源操作数 mem: 存储器操作数 OPR: 操作数 reg: 通用寄存器 EA: 偏移地址(偏移量) Sreg: 段寄存器 Port: 端口地址 Label: 标号 指令集不外乎下面几种: 数据传送指令 算术运算指令 逻辑运算与移位指令【整型 与 浮点型的处理】 串操作指令 程序控制指令 处理器控制指令 伪指令 一、数据传送【也叫转移】指令 通用数据传送指令. l MOV DST, SRC ;传送指令: 把源操作数的内容送入目的操作数 传送字或字节. 注意: 立即数做源操作数时, 立即数的长度必须小于等于目的操作数的长度 操作数DST, SRC分别为reg

5.方法运行时的栈帧

匆匆过客 提交于 2020-01-26 07:46:01
5方法运行时的栈帧 栈帧是虚拟机栈中用于执行方法调用的数据结构,是虚拟机栈中的栈元素。 一个栈帧存储了一个方法的 局部变量表 、 操作数栈 、 动态链接 、 方法返回地址 等信息。 每一个方法的调用与返回都对应着一个栈帧在虚拟机栈中的入栈出栈操作。 栈帧中 局部变量表的大小 、 操作数栈的深度 都在编译期确认了。因此栈帧的内存大小已经确定。 局部变量表 局部变量表用于存储 方法参数 和 方法内定义的局部变量 。 局部变量表 以变量槽(Slot)为基本单位 ,slot大小通常为32/64位,取决于具体实现。 double,long可以存在两个slot中。 slot存储:boolean,byte,char,short,int,float, reference ,returnAddress,long,double。 reference 代表一个对象的引用,通过其可以直接或间接的找到 对象在堆中的位置 以及对象所属类型在方法区中的存储的 类型信息 。 方法执行时通过局部变量表完成 参数值到参数变量列表的传递 过程。非static方法第一个slot存储对象的实例(也就是this引用)。 slot是可以重用的 ,slot可以在超出变量作用域后存放之后的变量。 局部变量 不像类变量一样存在准备阶段(附上系统预设的初值),因此 必须进行初始化 。 操作数栈 jvm执行引擎是栈结构

蜂鸟E203 硬件学习-两级流水线的实现(三)

蓝咒 提交于 2020-01-26 06:40:16
(二)EXU模块 EXU段包括指令译码,指令派发,指令发射,指令执行,内存操作,数据写回。而E203是简单的顺序单发射,顺序执行,顺序写回类型的处理器。 将IFU通过IR寄存器发送给EXU的指令进行译码和派遣。 通过译码出的操作数寄存器索引(Index)读取Regfile(如图中RD-Regfile) 维护指令的数据相关性(如OITF) 将指令派遣(Dispatch)给不同的运算单元执行(ALU、Long-Pipes、LSU、以及EAI) 将指令交付(检查指令分支预测是否正确,是否产生中断和异常) 将指令运算的结果写回Regfile(WB ARB) (1)EXU译码模块 (e203_exu_decode.v) 译码模块的输入信号来自于IR阶段,包含当前需要译码的指令,执行PC,预测结果,非对齐和存储器访问错误。 首先根据最后两个比特位判断当前译码指令是RV32还是RV16,再根据指令格式,产生不同的指令类型信息。如:寄存堆的索引和控制信号,跳转类型和所需计算的信息。 输出dec_info包含很多模块的控制信息,有BJP单元的控制信息,ALU单元的控制信息,CSR单元的控制信息,乘除单元的控制信息,AGU单元的控制信息。同时还要生成后面执行所需要的各类型立即数,当执行的指令为非法指令时,译码器模块还将产生各类型的异常指令异常信息。 (2)整数通用寄存器组 (e203_exu

Java技术与Java虚拟机

时光怂恿深爱的人放手 提交于 2020-01-26 00:21:12
Java技术与Java虚拟机   说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言 、 Java类文件格式 、 Java虚拟机 和 Java应用程序接口 (Java API)。它们的关系如下图所示: 图1 Java四个方面的关系   运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被 即时代码发生器 有选择的转换成机器码执行。从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示: 图2 Java平台结构图   在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与 底层操作系统 和 硬件 无关的关键。它的下方是 移植接口 ,移植接口由两部分组成: 适配器 和 Java操作系统 , 其中依赖于平台的部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上方是Java的基本类库和扩展类库以及它们的API, 利用Java API编写的应用程序(application) 和小程序(Java

JVM、JDK、JRE

隐身守侯 提交于 2020-01-26 00:18:17
JAVA执行过程:    Java源文件(*.java)---编译器(compiler)----->字节码文件(*.class)---解释器(interpreter)----->执行结果 JVM:   结构:1. JVM指令系统       JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由操作码和操作数两部分组 成。操作码为 8位 二进制数,       操作数紧随在操作码的后面,其长度根据需要而不同。当长度大于8位时,操作数被分为两个以上字节存放。       Java指令系统是以Java语言的实现为目的设计的,其中包含了用于 调用方法和监视多线程系统 的指令。       Java的8位操作码的长度使得JVM最多有256种指令,已使用了160多种操作码。      2. JVM寄存器       所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。JVM只设置了4个最为常用的寄存器。       ①.pc程序计数器       ②.optop操作数栈顶指针       ③.frame当前执行环境指针       ④.vars指向当前执行环境中第一个局部变量的指针       所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。      3. JVM栈结构