无符号数的识别
- 格式:doc
- 大小:137.50 KB
- 文档页数:21
计算机中数的表⽰和存储(总结)⼀、⽆符号数和有符号数1.⽆符号数计算机中的数均存放在寄存器中,通常称寄存器的位数为机器字长。
所谓的⽆符号数即没有符号的数,在寄存器中的每⼀位均可⽤来存放数值。
⽽当存放有符号位时,则留出位置存放“符号”。
因此,在机器字长相同时,⽆符号数与有符号数所对应的数值范围是不同的。
以机器字长16位为例⼦,⽆符号数的范围为0~(216-1=65535),⽽有符号数的表⽰范围为(-32768=215)~(+32767=215-1)(此数值对应原码表⽰)。
机器中的有符号数是⽤补码表⽰的。
2.有符号数对于有符号数⽽⾔,符号的正负机器是⽆法识别的,⽽在机器中是⽤0,1分别表⽰正,负的,并规定将它放在有效数字的前⾯,这样就组成了有符号数。
把符号“数字化”的数叫做机器数,⽽把带“+”或“-”符号的数叫做真值。
⼀旦符号数字化后,符号和真值就形成了⼀种新的编码。
有符号数有原码、补码、反码和移码等四种表⽰形式。
2.1 有符号数的编码⽅法-原码表⽰法原码是机器数中最简单的⼀种表⽰形式,其符号位为0表⽰正数,为1表⽰负数,数值位即真值的绝对值,故原码⼜称作带符号位的绝对值表⽰。
整数原码的定义为式中x为真值,n为整数的位数。
例如,当x=-1110时,[x]原=24-(-1110)=11110⼩数的原码定义为例如,当x=-0.1101时,[x]原=1-(-0.1101)=1.1101当x=0时[+0.0000]原=0.0000[-0.0000]原=1-(0.0000)=1.0000可见[+0]原不等于[-0]原,即原码中的零有两种表⽰形式。
原码编码的优缺点其表⽰简单明了,易于和真值转换,但⽤原码进⾏加减运算时,确带来了许多⿇烦。
2.2 有符号数的编码⽅法-补码表⽰法补码利⽤了⽣活中的“补数”的概念,即以某个数为基准,称为模数,该数对模数的取模运算的结果就是补数。
例如,-3=+9(mod12),4=4(mod12)=16(mod12)。
《编译原理》实验报告软件131 陈万全132852一、需求分析通过对一个常用高级程序设计语言的简单语言子集编译系统中词法分析、语法分析、语义处理模块的设计、开发,掌握实际编译系统的核心结构、工作流程及其实现技术,获得分析、设计、实现编译程序等方面的实际操作能力,增强设计、编写和调试程序的能力。
通过开源编译器分析、编译过程可视化等扩展实验,促进学生增强复杂系统分析、设计和实现能力,鼓励学生创新意识和能力。
1、词法分析程序设计与实现假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序。
输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。
输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。
对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。
2、语法分析程序设计与实现选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的一个简化子集——作为分析对象,根据如下描述其语法结构的BNF定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。
G2[<算术表达式>]:<算术表达式> → <项> | <算术表达式>+<项> | <算术表达式>-<项><项> → <因式> | <项>*<因式> | <项>/<因式><因式> → <运算对象> | (<算术表达式>)若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用E、T、F和i 代表,则G2可写成:G2[E]:E → T | E+T | E-T T → F | T*F | T/F F → i | (E)输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID ······输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。
有符号数的加减法和⽆符号数的加减法,和,系统是如何识别有符号数和⽆符号数的⼀.有符号数的加减法1、符号数与⽆符号数的⼈为规定性:⼀个数,是有符号数还是⽆符号数都是⼈为规定的。
真值:机器数是将符号"数字化"的数,是数字在计算机中的⼆进制表⽰形式。
只有符号数时才有。
机器数对应的数值称为机器数的真值。
这个机器数可能是原码,反码或补码。
也就是说不同含义的机器数 对应不同的真值。
原码与真值对应,但不能参加运算,只能由真值的补码形式参加运算。
(1)真值=>原码 (简单)去掉+ - 号前⾯加0 1。
原码=>真值 去掉0 1 前⾯加+ - 号。
eg: 真值 + 1001 1100 - 1010 0010原码 0 1001 1100 1 1010 0010(2)真值=>补码正真数的补码:去掉+号前⾯加0。
负真数的补码:去掉 - 号前⾯加1,从右到左找到第⼀个1,左边全部取反。
补码=>真值符号位0的补码的真值:去掉0前⾯加+号。
符号位1的补码的真值:去掉1前⾯加-号,从右到左找到第⼀个1,左边全部取反。
eg:真值 + 1001 1100 - 1010 0010补码 0 1001 1100 1 0101 1110例如求 1000 0100+0000 1110解答:默认数据从存储器中读取参与运算器运算。
问运算的结果是什么,没有说求什么码的事,那就是问结果的真值。
分符号数和⽆符号数两种情况。
若规定为⽆符号数,则(132)10+(14)10=(146)10。
//或写法(146)D // D (decimal)表⽰这个数是⼗进制若规定为符号数:默认存储的数都是补码。
[x]补 =b n ... b1b0。
(x是原码)1000 0100和0000 1110都是补码。
(补码加法运算 = 补码的对应真值的加法运算)补码1000 0010的真值为 - 111 1110 = -124 // 1000 0100是真值 -124的补码。
verilog有符号数和无符号数乘法运算Verilog有符号数和无符号数乘法运算在Verilog中,有符号数和无符号数乘法运算是非常重要的概念。
它们在数字电路设计和硬件描述语言中起着至关重要的作用。
在本文中,我们将深入探讨有符号数和无符号数乘法运算的原理、应用和区别,以便读者深入理解这一主题。
1. 有符号数和无符号数的定义在Verilog中,有符号数和无符号数是两种不同的数据类型。
无符号数是指仅由非负数组成的数字,而有符号数是指包含正负号的数字。
在硬件设计中,我们经常会遇到这两种类型的数据,并需要对它们进行不同的处理。
2. 有符号数和无符号数的乘法原理在Verilog中,有符号数和无符号数的乘法运算原理是有所不同的。
对于无符号数,乘法运算可以直接按照普通的乘法规则进行,即将两个数相乘得到结果。
而对于有符号数,由于需要考虑正负号的影响,乘法运算则需要根据补码或原码进行相应的转换和处理。
3. 有符号数和无符号数乘法运算的应用在数字电路设计中,有符号数和无符号数的乘法运算被广泛应用于各种计算单元和逻辑电路中。
它们可以用于实现乘法器、数据处理器和信号处理器等功能模块,为数字系统的运算提供强大的支持。
4. 有符号数和无符号数乘法运算的区别有符号数和无符号数的乘法运算在应用上有一些明显的区别。
在进行乘法运算时,需要考虑有符号数的溢出和符号位的处理,而无符号数则不需要。
在逻辑电路设计中,有符号数和无符号数的乘法运算通常需要采用不同的电路结构和算法来实现。
5. 个人观点和理解在我看来,有符号数和无符号数的乘法运算是数字电路设计中非常重要的问题。
它们不仅涉及到硬件描述语言的应用,也涉及到数字系统的实际运算。
深入理解和掌握有符号数和无符号数乘法运算的原理和实现方法,对于提高数字电路设计的水平和能力是非常有益的。
总结回顾通过本文的探讨,我们对Verilog中有符号数和无符号数乘法运算有了更深入的理解。
我们深入分析了它们的原理、应用和区别,也分享了个人的观点和理解。
实验二单词符号种别识别程序设计一、实验目的通过C语言词法分析程序的实现理解编译程序过程中词法分析对单词的种别识别过程。
二、实验重难点单词识别三、实验内容与要求1.阅读教材P2-P3词法分析部分内容,明确词法分析的任务。
2.阅读实验案例,明确实验要求、模块流程图和程序实现方案;3.参考实验案例,完成简单的词法分析程序设计。
四、实验学时4课时五、实验设备与环境C语言编译环境六、实验案例1.待分析的简单的词法(1)关键字:begin if then while do end所有的关键字都是小写。
(2)运算符和界符:= + - * / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格由空白、制表符和换行符组成。
空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。
2.各种单词符号对应的种别码见表6.1:3.词法分析程序的功能:输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。
其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。
例如:对源程序begin x:=9; if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……4.词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
(1)主程序示意图:主程序示意图如图6-1所示。
其中初值包括以下两个方面:➢关键字表的初值:关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。
大家都知道数据在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别0和1这两个数,所以根据排列,1个字节能代表256种不同的信息,即28(0和1两种可能,8位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是0~255(0~ 28-1)这些数,一共是256个数,因为,前面说了,一个字节只能表示256种不同的信息。
别停下,还是一个字节的无符号整数,我们来进一步剖析它,0是这些数中最小的一个,我们先假设它在计算机内部就用8位二进制表示为00000000(从理论上来说也可以表示成其他不同的二进制码,只要这256个数每个数对应的二进制码都不相同就可以了),再假设1表示为00000001,2表示为00000010,3表示为00000011,依次类推,那么最大的那个数255在8位二进制中就表示为最大的数11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。
比如我给你一个2个字节大小的二进制码,首先声明它表示的是无符号的整数:00000000 00000010,我们把前面的0省略,换算一下,它表示的也是数值2,和前面不同的是,它占了2个字节的内存。
不同的类型占的内存空间不同,如在我的电脑中char是1个字节,int是4个字节,long是8个字节(你的可能不同,这取决于不同的计算机设置),它们的不同之处仅仅是内存大的能表示的不同的信息多些,也就是能表示的数范围更大些(unsigned int能表示的范围是0~28*4-1),至于怎么算,其实都是一样的,直接把二进制与十进制相互转换,二进制就是它在计算机中的样子,十进制就是我们所表示的数(误解:不同的计算机储存的原理是不同的,取决于商家的喜好呢)。
无符号数的词法分析程序一、实验目的和要求(1)初步掌握编译原理的实验的技能;(2)验证所学理论、巩固所学知识并加深理解。
二、实验内容和原理内容:掌握词法分析的基本思想,并用高级语言编写无符号数(包括整数和实数)的词法分析程序。
要求:从键盘中输入一字符串(包括字母、数字等),编写程序识别出其中的无符号数。
无符号数的文法规则课定义如下:<无符号数> <无符号实数>|<无符号整数><无符号实数> <无符号整数>.<数字串>[E<比例因子>]<比例因子> <有符号整数><有符号整数> [+|-]<无符号整数><无符号整数> <数字串><数字串> <数字>{<数字>}<数字> 0 1 2 3 4 5 6 7 8 9本实验中我利用了状态转化图的思想,下面是试验中用到构造的状态转化图:字描述状态机的代码格式如下:int state = S0 ;while(1){Switch(state){case S0 :if(T0转移条件满足) {状态转移到满足T0的次态;操作;}if(T1转移条件满足) {状态转移到满足T1的次态;操作;}if(T2转移条件满足) {状态转移到满足T2的次态;操作;}…Break ;case S1 ://插入S1状态下的操作;break ;…}}实验代码://本程序主要实现实数的识别import java.io.BufferedReader ;import java.io.IOException ;import java.io.InputStreamReader ;public class RealNumberIdentified {/*---------------------------------成员变量的定义---------------------------------------*/private final int S_0 = 0 ;private final int S_1 = 1 ;private final int S_2 = 2 ;private final int S_3 = 3 ;private final int S_4 = 4 ;private final int S_5 = 5 ;private final int S_6 = 6 ;private final int S_7 = 7 ;private char originNumber[ ] ; //用来记录原始的数字串private String resultNumber = new String( ) ;private int realnumberAmount = 0 ; //用来记录识别出的实数的个数private int realnumberFlag = 0 ; //用于标识该实数是正数还是负数private int eFlag = 0 ; //用来标识该实数是不是指数实数private int pointFlag = 0 ; //用来标识该实数是否是小数private int basePlusMinus = 1 ; //用来标识底数的符号private int count = 0 ; //用来记录已经识别数字串的位数private int currentState = S_0 ; //用来记录当前所处于的状态/*---------------------------------------------------------------------------------------*//*-------------------------该方法用来初始化一些参数------------------------------------*/private void init( ){resultNumber = new String( ) ;basePlusMinus = 1 ;eFlag = 0 ;pointFlag = 0 ;}/*----------------------------------------------------------------------------------------* //*---------------------init( )方法用于去除实数串开始和结尾的无效的空格----------------*/private void initOriginNumber( String str ){str = str.trim( ) ;str += '#' ;originNumber = str.toCharArray( ) ;}/*-----------------------------------------------------------------------------------------*//*---------------------------printResult()方法用来输出识别的结果------------------------*/private void printResult( ){if( realnumberFlag == 0 )System.out.println( "\n识别结束,您所输入的字符串中不包含任何实数!" ) ;else{realnumberAmount ++ ;if( realnumberAmount == 1 )System.out.println( "\n识别结束,您所输入的字符串中所包含的实数如下:" ) ;if( resultNumber.length( ) != 0 ){if( eFlag == 1 )if( basePlusMinus == 1 )System.out.println( "正指数实数:" + Double.parseDouble( resultNumber ) ) ;elseSystem.out.println( "负指数实数:" + Double.parseDouble( resultNumber ) ) ;elseif( pointFlag == 1 )System.out.println( " 小数:" + Double.parseDouble( resultNumber ) ) ;else{if( basePlusMinus == 1 )System.out.println( " 正整数:" + Long.parseLong( resultNumber ) ) ;elseSystem.out.println( " 负整数:" + Long.parseLong( resultNumber ) ) ;}}}}/*-----------------------------------------------------------------------------------------*//*--------------------------------识别该实数串的过程-------------------------------------*/private void identifiedProcess( String str ){initOriginNumber( str ) ;while( count < originNumber.length ){switch( currentState ){case S_0 : {if( originNumber[ count ] == '+' ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_1 ;}else{if( originNumber[ count ] == '-' ){resultNumber = resultNumber + originNumber[ count ] ;basePlusMinus = 0 ;currentState = S_1 ;}elseif( originNumber[ count ] >=48 && originNumber[ count ] <=57 ){resultNumber = resultNumber + originNumber[ count ] ;realnumberFlag = 1 ;currentState = S_2 ;}else{currentState = S_0 ;}}count ++ ;break ;}case S_1 : {if( originNumber[ count ] >=48 && originNumber[ count ] <=57 ){resultNumber = resultNumber + originNumber[ count ] ;realnumberFlag = 1 ;currentState = S_2 ;}else{resultNumber = resultNumber.substring( 0 , resultNumber.length( ) - 1 ) ;currentState = S_0 ;}count ++ ;break ;}case S_2 : {if( originNumber[ count ] == '.' ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_3 ;}elseif( originNumber[ count ] >=48 && originNumber[ count ] <=57 ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_2 ;}elseif( originNumber[ count ] == 'E' || originNumber[ count ] == 'e' ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_5 ;}else{if( originNumber[ count ] == '+' || originNumber[ count ] == '-' )count -- ;printResult( ) ;init( ) ;currentState = S_0 ;}count ++ ;break ;}case S_3 :{if( originNumber[ count ] >=48 && originNumber[ count ] <=57 ){resultNumber = resultNumber + originNumber[ count ] ;pointFlag = 1 ;currentState = S_4 ;}else{resultNumber.length( ) - 1 ) ;printResult( ) ;init( ) ;currentState = S_0 ;}count ++ ;break ;}case S_4 : {if( originNumber[ count ] >=48 && originNumber[ count ] <=57 ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_4 ;}else{if( originNumber[ count ] == 'E' || originNumber[ count ] == 'e' ){originNumber[ count ] ;currentState = S_5 ;}else{if( originNumber[ count ] == '+' || originNumber[ count ] == '-' )count -- ;printResult( ) ;init( ) ;currentState = S_0 ;}}count ++ ;break ;}case S_5 : {if( originNumber[ count ] == '+' ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_6 ;}elseif( originNumber[ count ] == '-' ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_6 ;}elseif( originNumber[ count ] >= 49 && originNumber[ count ] <= 57 ){resultNumber = resultNumber + originNumber[ count ] ;eFlag = 1 ;currentState = S_7 ;}else{resultNumber = resultNumber.substring( 0 , resultNumber.length( ) - 1 ) ;printResult( ) ;init( ) ;currentState = S_0 ;count -- ;}count ++ ;break ;}case S_6 : {if( originNumber[ count ] >= 49 && originNumber[ count ] <= 57 ){resultNumber = resultNumber + originNumber[ count ] ;eFlag = 1 ;currentState = S_7 ;}else{resultNumber = resultNumber.substring( 0 , resultNumber.length( ) - 2 ) ;printResult( ) ;init( ) ;currentState = S_0 ;count -= 2 ;}count ++ ;break ;}case S_7 : {if( originNumber[ count ] >= 48 && originNumber[ count ] <= 57 ){resultNumber = resultNumber + originNumber[ count ] ;currentState = S_7 ;}else{if( originNumber[ count ] == '+' ||originNumber[ count ] == '-' )count -- ;printResult( ) ;init( ) ;currentState = S_0 ;}count ++ ;break ;}}}printResult( ) ;}/*------------------------------------------------------------------------------------------*//*----------------------------------------主方法-------------------------------------------*/public static void main(String[ ] args) throws IOException {System.out.print( "请输入欲识别的实数:" ) ;BufferedReader buf = new BufferedReader( new InputStreamReader( System.in ) ) ;new RealNumberIdentified( ).identifiedProcess( buf.readLine( ) ) ;}/*------------------------------------------------------------------------------------------*/}三、实验结果四、讨论、分析和心得在本次试验我并没有采用课本中提供的算法,而是将在课本中学到的状态转化图和自动机的理论加以利用以基本实现本次实验的要求。