符号计算

深入理解计算机系统(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

Golang 学习笔记 004 基础数据类型及输出格式化标记

只谈情不闲聊 提交于 2020-01-08 21:29:21
数据类型-基础数据类型 Go 语言中包含的数据类型有以下几种: 基础类型 布尔型 bool : 值只可以是常量 true 或者 false 字符串 string : 由一串固定长度的字符连接起来的字符序列 整数 有符号整数 int : 在 32 位系统上通常为 32 位宽,在 64 位系统上则为 64 位宽 int8 : 有符号 8 位整型 (-128 到 127) int16 : 有符号 16 位整型 (-32768 到 32767) int32 : 有符号 32 位整型 (-2147483648 到 2147483647) int64 : 有符号 64 位整型 (-9223372036854775808 到 9223372036854775807) 无符号整数 uint : 在 32 位系统上通常为 32 位宽,在 64 位系统上则为 64 位宽 uint8 : 无符号 8 位整型 (0 到 255) uint16 : 无符号 16 位整型 (0 到 65535) uint32 : 无符号 32 位整型 (0 到 4294967295) uint64 : 无符号 64 位整型 (0 到 18446744073709551615) 特殊整型 uintptr : 无符号整型,用于存放一个指针。在32位系统上通常为32位宽,在64位系统上则为64位宽 byte : uint8 的别名

Compiler - lexical analysis

无人久伴 提交于 2020-01-05 01:39:47
概念 : 1. Context-Free Grammar : a). 一个终结符集合。b). 一个非终结符集合。c). 一个产生式集合,产生式左部为一个非终结符,右部为终结符或非终结符序列。d). 一个初始状态。 2. Parse Tree(Concrete Syntax Tree), Abstract Syntax Tree(AST) 文法: list -> list+digit | list-digit | digit; digit -> 0|1|2|3|4|5|6|7|8|9 抽象语法树不包含具体的文法信息(或形式) 3. Syntax-Directed Translation 翻译模式: 参考Antlr中的Arbitrary Actions。Syntax-Directed: 文法符号与一个属性集合关联,产生式与一个语义规则集合关联,文法符号(属性集合)和语义规则集合构成Syntax-Directed定义,参考Antlr的Rewrite Rules 4. Nondeterministic finite automata NFA a). 一个状态的有穷集合S; b). 一个输入符号集合Σ; c). 一个转换函数move,把状态和符号组成的二元组映射到状态集合; d). 状态s0是唯一的初始状态; d). 状态集合F是终止状态集合 5. Deterministic finite

拼了整整一天,把这个问题搞明白了(看我上一篇文章的问题)

喜欢而已 提交于 2020-01-04 05:24:39
1.模的概念(我只讲个例子,具体的可以查数学中的 "同余模") 在日常生活中,有许多化减为加的例子。例如,时钟是逢12进位,12点也可看作0点。 当将时针从10点调整到5点时有以下两种方法: 1.将时针逆时针方向拨5格,相当于做减法: 10-5=5 2.将时针顺时针方向拨7格,相当于做加法:10+(12-5)=12+5=5 (模为 12) 2.模的运用(采用模得到 补码 ) 1. 补码 的得来:是为了让负数变成能够加的正数,so,负数的 补码 =模-负数的绝对值 比如:-1 补码 :1111 1111(10000 0000 -1得来) 当一个数要减1的时候,可以直接加 1111 1111 2.原码的得来:(负数的原码,直接把对应正数的最高位改为1) 原码能够直观的表示一个负数(能直观的把真值显示出来,如 -1为1000 0001 其中最高位表示符号位,不进行算术计算) 3.总结: 补码 相加,到第9位才舍弃(模10000 0000) 原码相加,到第8位舍弃(模1000 0000) 反码相加,到第8位舍弃(模1000 0000) 3.原码和 补码 之间转换: 1. 补码 =原码减1,再取反(便于理解) 或 补码 = 反码+1(便于描述和推理) 2.演示: 补码 =原码减1,再取反 如-1的原码1000 0001-->1000 0000(减1后)-->1111 1111(取反后) 补码

计算器work_day05

爱⌒轻易说出口 提交于 2020-01-02 19:56:48
day_work_05 ------Python是一个优雅的大姐姐 作业计算器 设计思路 按照运算优先级和正则先算括号内的值,提出来判断符号问题,然后依次计算。 分析题目设计了四个函数,分别为a)去括号函数b)去符号函数c)去乘除号函数d)去加减号函数 各个函数之间实行调用,完美解决问题,可能会有bug。 运行代码 # Author:Xiong # 开发一个简单的python计算器 # 实现加减乘除及拓号优先级解析 # 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) ) # 等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现), import re def remove_04(str_4): print( '****** 去掉符号重复******' ) flag = True while flag: flag = False if str_4.find( '*+' ) != -1: str_4 = str_4.replace( '*+' , '+' ) flag = True if str_4.find( '+-' ) != -1: str_4 = str_4.replace( '+-' , '-

JVM知识点梳理

Deadly 提交于 2019-12-31 12:06:05
Java JVM执行流程 1 JVM的结构 1.1class文件的格式 1.2 数据类型 1.2.1 基础数据类型和取值 1.2.2 引用数据类型 1.3 运行时数据区 1.4 虚拟机栈帧 Frame 1.5 Java类加载过程 JDK版本是1.8.0_231,以下是官方对JVM的介绍,我简单翻译了一下,将就着看吧。 The Java Virtual Machine is the cornerstone of the Java platform. It is the component of the technology responsible for its hardware and operating system independence, the small size of its compiled code, and its ability to protect users from malicious programs . JVM是Java平台的基石,它是计算机硬件技术层面的操作系统无关性的组件,编译后的一小段代码 ,能保护用户不熟恶意程序的攻击。 The Java Virtual Machine is an abstract computing machine. Like a real computing machine, it has an instruction

arm-linux-ld 命令详解

烈酒焚心 提交于 2019-12-29 01:48:30
本文转自《S3C2410完全开发手册》 在开始后续实验之前,我们得了解一下arm-linux-ld连接命令的使用。在上述实验中,我们一直使用类似如下的命令进行连接: arm-linux-ld -Ttext 0x00000000 crt0.o led_on_c.o -o led_on_c_tmp.o 我们看看它是什么意思: -o选项设置输出文件的名字为led_on_c_tmp.o; “--Ttext 0x00000000”设置代码段的起始地址为0x00000000; 这条指令的作用就是将crt0.o和led_on_c.o连接成led_on_c_mp.o可执行文件,此可执行文件的代码段起始地址为0x00000000(即从这里开始执行)。 我们感兴趣的就是“—Ttext”选项!进入LINK目录,link.s代码如下: 1 .text 2 .global_start 3 _start: 4 b step1 5 step1: 6 ldr pc,=step2 7 step2: 8 b step2 Makefile 如下: 1 link:link.s 2 arm-linux-gcc –c -o link.o link.s 3 arm-linux-ld -Ttext 0x00000000 link.o -o link_tmp.o 4 #arm-linux-ld -Ttext 0x30000000

原码,补码,反码

对着背影说爱祢 提交于 2019-12-27 13:19:24
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码, 反码和补码的概念.对于一个数,

数据结构和算法之栈1

二次信任 提交于 2019-12-27 04:33:24
数组模拟栈 (1)将数组模拟成栈的思想: //用数组模拟栈的思想: * 1·先创建栈,用数组 * 2·定义一个变量top表示栈顶,初始化为-1 * 3·入栈:top++,stack[top]=val,要进行栈满的操作 * 4·出栈:数据取出:int value=stack[top];top--即可,要进行判断栈为空的操作,因为有返回值,所以一般我们进行异常抛出*/ 1.1:注意:因为是拿数组进行模拟栈 1:在栈类中有一个数组 2:在栈类中有一个maxSize定义栈的大小;因为栈是有大小的 3:在栈类中必须有一个指针一直指向栈顶,初始值为-1; 4:其次是在栈类中写入方法,模拟实现栈即可 1.2:栈的代码如下所示 package com.dataStrcture; import java.util.Scanner; //用数组模拟栈 /*思想: * 1·先创建栈,用数组 * 2·定义一个变量top表示栈顶,初始化为-1 * 3·入栈:top++,stack[top]=val,要进行栈满的操作 * 4·出栈:数据取出:int value=stack[top];top--即可,要进行判断栈为空的操作,因为有返回值,所以一般我们进行异常抛出*/ class ArrayStack{ public int maxSize;//栈的大小 public int[]stack; public int

有符号补码的加减法以及大小比较

↘锁芯ラ 提交于 2019-12-27 04:30:27
有符号补码的加减法以及大小比较 1.瞎扯简述  最近在写用fpga进行解缠绕的IP,解缠绕做的事情并不算复杂,就是比较后进行加减而已。但是解缠绕前面这个IP是用的xilinx的Cordic内核,算出来的是补码,过去只做了一些什么简单的取反加一的简单原码补码转换,所以在这里加减就懵了,没有真正碰过补码运算,正好借此机会好好整明白补码的操作。 2.原码与补码的转换  什么是有符号原码,补码怎么转换的,百度即可,耐心看5分钟就整明白了。 3.表示范围  对于8位有符号数的来讲,原码很容易理解,表示范围是-127-127。但是计算机不采用原码存储,采用补码,+0和-0的补码都是0000 0000,当时最令我疑问的1000 0000为什么表示-128,对1000 0000的符号位不变,数值位取反加一,就变成了1 0000 0000,就算我人为规定了1 0000 0000这个就是-128的补码,但是计算机怎么识别呢,毕竟这是个9位数据。   其实 ,还是自己低估了补码的意义。  我们就来看看把1000 0000作为-128的补码能不能参与运算,为了方便大家验证,我们下面不以 8位有符号数来验证,以4位有符号数验证。4位有符号数是从-8-7,1000就是-8的补码。   举个例子 ,-8+6=1000+0110=1110 1110的原码是1010=-2 正确 ,1000作为