操作数

Java的运算符

耗尽温柔 提交于 2020-01-11 01:58:13
Java的运算符 运算符的分类 算术运算符 赋值运算符 关系运算符 逻辑运算符 位运算符 其他运算符 运算符的分类 运算符指明对操作数的运算方式。组成表达式的Java操作符有很多种。运算符按照其要求的操作数数目来分,可以有单目运算符、双目运算符和三目运算符,它们分别对应于1个、2个、3个操作数。运算符按其功能来分,有算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符和其他运算符。 算术运算符 单目: ~ (按位取反)、 ! (取非)、 - (负号运算符)、 ++ (自增)、 -- (自减) 双目: + (加)、 - (减)、 * (乘)、 / (除)、 % (取余) 三目: a > b ? true : false (当 a 大于 b 的时候,为 true,否则为 false;这整个运算符包括一个关系运算符(可以是“ > ”,“ < ”,“ != ”等等),一个“ ? ”,一个“ : ”,冒号前后需要有两个表达式、值或者是对象。) 赋值运算符 = += -= *= /= %= &= ^= |= <<= >>= 关系运算符 关系运算符用于比较两个数值之间的大小,其运算结果为一个逻辑类型(boolean布尔类型)的数值。 等于符号: == 不等于符号: != 大于符号: > 小于符号: < 大于等于符号: >= 小于等于符号: <= 逻辑运算符 与(&&) 对于&来说

从字节码角度分析装箱和拆箱

不羁的心 提交于 2020-01-11 01:48:08
一.拆箱和装箱的基本介绍 装箱和拆箱是Java中提供的两个有用的语法糖。 装箱是指将基本数据类型自动转换为它的包装器类型。如int到Integer的转换。 拆箱是指将包装器类型转换为对应的基本数据类型。如Integer到int的转换。 以下是一个例子: Integer num1 = 1000 ; int num2 = num1 ; 其中num1是一个Integer类型的对象,这里对它的赋值操作就是一个装箱的过程。 num2是一个基本类型int的变量,用num1给它赋值就是一个拆箱的过程。 二.拆箱和装箱的字节码实现 下面我们从字节码的角度看一下装箱和拆箱是如何实现的吧。 那么如何获取到Java代码的字节码呢?其实我们在使用javac对Java源代码进行编译后得到的class文件就是其字节码文件。 但是这个class文件是二进制形式存在的,是无法直接阅读的。所以还需要另外一个命令 javap帮我们把class文件解析为可读的形式 。 我们将以下代码保存在 test.java 文件中(这里省略了类目、main方法等): Integer num1 = 1000 ; int num2 = num1 ; javap 命令的使用 然后用javac进行编译,再用 javap -v 进行反编译。javap加上-v参数可以看到较为全面的信息。 javac test.java javap -v

java虚拟机内存模型

一曲冷凌霜 提交于 2020-01-10 18:30:36
目录 一、虚拟机 二、虚拟机组成 1.栈 栈帧 2.程序计数器 3.方法区 对象组成 4.本地方法栈 5.堆 GC GC案例 一、虚拟机 ​ 同样的java代码在不同平台生成的机器码肯定是不一样的,因为不同的操作系统底层的硬件指令集是不同的。 同一个java代码在windows上生成的机器码可能是0101…,在linux上生成的可能是1100…,那么这是怎么实现的呢? 不知道同学们还记不记得,在下载jdk的时候,我们在oracle官网,基于不同的操作系统或者位数版本要下载不同的jdk版本,也就是说针对不同的操作系统,jdk虚拟机有不同的实现。 那么虚拟机又是什么东西呢,如图是从软件层面屏蔽不同操作系统在底层硬件与指令上的区别,也就是跨平台的由来。 说到这里同学们可能还是有点不太明白,说的还是太宏观了,那我们来了解下java虚拟机的组成。 二、虚拟机组成 ​ 1.栈 我们先讲一下其中的一块内存区域栈,大家都知道栈是存储局部变量的,也是线程独有的区域,也就是每一个线程都会有自己独立的栈区域。 public class Math { public static int initData = 666; public static User user = new User(); public int compute() { int a = 1; int b = 2; int c = (a+b

逆波兰表达式

不羁岁月 提交于 2020-01-10 10:43:47
本文转载自: https://www.cnblogs.com/wanghetao/archive/2012/04/23/2466580.html 作者:wanghetao 转载请注明该声明。 逆波兰 表达式 表达式一般由操作数(Operand)、运算符(Operator)组成,例如算术表达式中,通常把运算符放在两个操作数的中间, 这称为中缀表达式(Infix Expression),如A+B。 波兰数学家Jan Lukasiewicz提出了另一种数学表示法,它有两种表示形式: 把运算符写在操作数之前,称为波兰表达式(Polish Expression)或前缀表达式(Prefix Expression),如+AB; 把运算符写在操作数之后,称为逆波兰表达式(Reverse Polish Expression)或后缀表达式(Suffix Expression),如AB+; 其中,逆波兰表达式在编译技术中有着普遍的应用。 算法: 一、 将中缀表达式转换成后缀表达式算法: 1、从左至右扫描一中缀表达式。 2、若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈 3、若读取的是运算符 (1) 该运算符为左括号"(",则直接存入运算符堆栈。 (2) 该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止。 (3) 该运算符为非括号运算符: (a)

深入理解计算机系统(3.3)---数据传送(或者说复制)指令详解

折月煮酒 提交于 2020-01-10 08:57:02
引言   上一章我们已经介绍了汇编语言的基础部分,包括数据格式、寄存器以及操作数的标识方式,接下来我们就应该去认识一下汇编语言当中的各个指令了。这些指令大多数都非常简单,但是组合在一起却能模拟出我们程序当中想要的任何效果,确实是十分神奇的一件事。    数据传送指令   数据传送指令的目的是为了将一个数据从一个位置复制到另外一个位置。既然如此,那么数据传送指令就会包含一个源操作数和一个目的操作数,指令会将原操作数的值复制到目的操作数并覆盖。   数据传送指令一共可分为五种,分别是mov、movs、movz、push以及pop,下面LZ依次介绍一下这五个指令的作用。    mov指令   mov指令的作用是将源操作数S中的数据复制到目的操作数D中,mov指令有一个数据格式和两个操作数,因此一般的形式为[movx S D]。其中x为数据格式,S为源操作数,D为目的操作数。   这里举一个简单的例子,比如我们有一条指令为movl %edx %eax。那么它的执行过程就如下图所示。   可以看到,在指令执行之后,%edx寄存器当中的内容会被复制到%eax寄存器。需要一提的是,mov指令可以在后面加上任何数据格式,比如上面这一过程中,数据格式则为四个字节,也就是双字。因此不难推断出,我们还可以使用movb和movw去复制一个字节或者两个字节。 movs指令  

【转贴】GCC 内联汇编

旧巷老猫 提交于 2020-01-10 04:55:40
1. 简介 1.1 版权许可 Copyright (C) 2003 Sandeep S. 本文档自由共享;你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它;也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本。 发布这篇文档是希望它能够帮助别人,但是没有任何担保;甚至不包括可售性和适用于任何特定目的的担保。关于更详细的信息,可以查看 GNU 通用许可证。 1.2 反馈校正 请将反馈和批评一起提交给 Sandeep.S。我将感谢任何一个指出本文档中错误和不准确之处的人;一被告知,我会马上改正它们。 1.3 致谢 我对提供如此棒的特性的 GNU 人们表示真诚的感谢。感谢 Mr.Pramode C E 所做的所有帮助。感谢在 Govt Engineering College 和 Trichur 的朋友们的精神支持和合作,尤其是 Nisha Kurur 和 Sakeeb S 。 感谢在 Gvot Engineering College 和 Trichur 的老师们的合作。 另外,感谢 Phillip , Brennan Underwood 和 colin@nyx.net ;这里的许多东西都厚颜地直接取自他们的工作成果。 2. 概览 在这里,我们将学习 GCC 内联汇编。这里内联表示的是什么呢?

深入理解计算机系统(3.5)---特殊的算术操作指令详解

南楼画角 提交于 2020-01-10 03:50:23
引言   上一章我们讨论了常见的算术与逻辑运算指令,其中比较有特点的是leal指令,本章我们再来看几个比较特殊的操作指令,这些指令可以让只有32位的寄存器存储64位的数据,是不是十分霸气侧漏呢。 初识   我们先来看看这些指令的大致介绍,如果各位看过上一章的话,会发现这里的指令有的会有些眼熟,但是它们的作用却截然不同。以下是书中的一张概图。   第一个指令有些眼熟吧,它就是我们上一章当中的imul乘法指令的双字形式。不过可以看出,这里的imull指令已经完全变了味道,它将结果存入两个寄存器。接下来,我们来仔细看看这些指令。 imull、mull指令   这两个指令一看就是双胞胎,它们一个负责有符号全64位乘法,一个负责无符号全64位乘法。细心的猿友会发现,imull这个指令好像是负责乘法的指令,而且在之前的乘法并没有区分有符号和无符号,现在怎么又成双胞胎指令了。   我们上一章当中出现的指令是imul指令,当它操作双字的时候,也就是imull指令。不过不同的是,它的一般形式是imull S D,这里有两个操作数,它将计算S和D的乘积并截断为双字,然后存储在D当中。由于在截断时,无符号以及有符号的二进制序列是一样的,因此此处的乘法指令并不区分有符号和无符号。   本次我们讨论的imull指令,则与上面的普通乘法指令稍有不同,它只有一个操作数,也就是说,它的一般形式为imull S

javascript类型转换

为君一笑 提交于 2020-01-10 03:37:13
Javascript类型转换: 值 转换为:字符串 数字 布尔值 对象 undefined “undefined” NaN false throws TypeError null “null” 0 false throws TypeError true “true” 1 new Boolean(true) false “false” 0 new Boolean(false) “”空字符串 0 false new String(“”) “1.2”(非空,数字) 1.2 true new String(“1.2”) “one”(非空,非数字) NaN true new String(“one”) 0 “0” false new Number(0) -0 “0” false new Number(-0) NaN “NaN” false new Number(NaN) Infinity “Infinity” true new Number(Infinity) -Infinity “-Infinity” true new Number(-Infinity) 1(无穷大,非零) “1” true new Number(1) {}(任意对象) true [](任意数组) “” 0 true [9](1个数字对象) “9” 9 true [‘a’](其他数组) 使用join()方法 NaN

深入理解计算机系统(3.4)------算术和逻辑操作

拟墨画扇 提交于 2020-01-10 01:50:15
  上一篇博客 我们介绍了几种数据传送指令,包括MOV,MOVS,MOVZ,PUSH和POP等,理解起来也不算难。本篇博客我们来接着看汇编语言的算术与逻辑运算指令,算术无非就是加减乘除,而逻辑运算也就是与或非,移位等操作。下面这张图是汇编里面的算术和逻辑操作:      上面除了 leal(加载有效地址)指令通常用来执行简单的算术操作,其余的指令都是标准的一元或者二元操作,下面我们分别来介绍这几个指令操作。 1、leal 指令   leal 指令也称为加载有效地址(load effective address)指令,它实际上是 movl 指令的变形。它的指令形式是从存储器读数据到寄存器,但实际上它根本没有引用存储器。   它的第一个操作数看上去是一个存储器引用,但该指令并不是从指定的位置读取数据,而是将有效地址写入到目的操作数,类似于 C 语言的取地址操作符“&”。另外就是作普通的算术运算。   leal 立即数,寄存器   这类指令就是将立即数装载至寄存器,比如 leal $0x01,%eax 这种情况下 和 movl $0x01,%eax 的效果是等价的    leal 地址,寄存器   leal指令的作用是将地址加载到寄存器,对于leal S,D而言,就是实现了 &S –> D 的功能    leal S, D 结果是&S -> D   movl S,D 结果是S -> D

深入理解计算机系统(3.4)---算数与逻辑运算指令详解

耗尽温柔 提交于 2020-01-10 01:49:14
引言   上一章我们已经着重讨论了数据传送(或者说复制)指令,相信各位猿友现在都已经对此有一些了解了。说真的,LZ在看第三章的过程中,不断的被汇编的魅力深深的震撼,这些看似简单的汇编指令,却可以将复杂的程序井然有序的执行完毕,实在是让人惊叹。时至今日, 这本看似枯燥无比却实则魅力十足的书,已经深深的将LZ吸引了。   希望各位猿友也有这样的感觉,这是一种非常好的感觉,接下来,各位就一起和LZ来认识认识新的指令吧。 算术与逻辑运算指令   算术与逻辑运算包括很多种,估计各位猿友也能很快的想出来,比如最常见的加减乘除、与或非、左移右移等等。这里可能还有一个各位猿友不太容易想到的,就是取地址运算符,不过这个运算指令却是LZ看过这一部分之后,觉得最精妙的一个指令。   接下来LZ将书中的一个表格贴上来,各位猿友可以先大致浏览下里面的指令。   这里面比较特别的指令就是leal(取地址指令),其余的指令都是比较常规的算术和逻辑运算,相比之下还比较好理解,因此LZ这里重点介绍leal指令,对于其余的指令LZ不会一一介绍,接下来我们就认识一下这个特别的leal指令吧。 leal指令   leal指令是非常神奇的一个指令,它可以取一个存储器操作数的地址,并且将其赋给目的操作数。如果用C语言当中来对应的话,它就相当于&运算。   比如对于leal 4(%edx,%edx,4),%eax这条指令来讲