实验二 无符号数和带符号整数的表示
- 格式:doc
- 大小:2.04 MB
- 文档页数:2
浙江大学城市学院实验报告课程名称计算机系统原理实验实验项目名称实验三数据的机器级表示实验成绩指导老师(签名)日期一、实验目的:1、通过无符号数和带符号整数之间的相互转换来理解无符号数和补码整数的表示;2、了解IEEE 754浮点数在机器中的应用,特别是一些特殊值的处理。
二、实验步骤:1、用32位补码表示的机器上编译并执行以下程序,记录程序的执行结果,并解释原因。
图3-1运行结果:对运算结果的解释:第一个结果:因为在ISO C90标准中,编译器将-2147483648分为两个部分来处理。
首先将2147483648看成无符号整型,其机器数为0x80000000,然会对其取负,结果仍为0x80000000,还是将其看成无符号整型,其值仍为21474833648,因此前者大于后者。
第二个结果:由于i为int型变量,因此这两个数皆为带符号数,前者小于后者。
第三个结果:编译器首先将2147483647看成带符号整型,然后对其取负,得到-2147483647,然后对其-1得到-2147483648,因此前者大于后者。
2、编写程序,计算表2.1中的表达式,说明运算类型(无符号、带符号),得到运算结果,并说明为什么是这样的运算结果(参考第二章习题8);源代码:运算结果:对运算结果的解释:1.0和0U都是无符号数,值相等2.-1和0都为带符号数,因此前者小于后者3.0后加上U表示无符号数,因此比较时前者大于后者4.-2147483647-1的计算结果为一个int型整数,为带符号数,因此前者大于后者。
5.加上U的数都为无符号数,因此前者小于后者6.2147483648U在经过int强制类型转换后,变为带符号的-2147483648,因此前者大于后者7.两个数皆为带符号数,因此前者大于后者8.数据转化为无符号数,前者11…1B (2^32-1) > 后者11…10B (2^32-2)3、分析以下代码:当len = 0 时, 执行sum 函数的for循环时会发生Access Violation , 即段错误异常. 但是, 当参数len 说明为int 型时, sum 函数能正确执行, 为什么?编写程序测试并分析。
实验二算术运算类操作实验 (基础与设计)一、实验要求和目的1、了解汇编语言中的二进制、十六进制、十进制、BCD 码的表示形式;2、掌握各类运算类指令对各状态标志位的影响及测试方法;3、熟悉汇编语言二进制多字节加减法基本指令的使用方法;4、熟悉无符号数和有符号数乘法和除法指令的使用;5、掌握符号位扩展指令的使用。
6、掌握BCD 码调整指令的使用方法二、软硬件环境1、硬件环境:计算机系统 windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识本实验主要进行算术运算程序设计和调试,涉及到的知识点包括:1.加减法处理指令主要有加法指令ADD,带进位加法ADC,减法指令SUB,带进位减法指令SBB。
2.乘除法指令和符号位扩展指令主要有无符号数乘法指令MUL,带符号数乘法指令IMUL,无符号数除法指令DIV,带符号数除法指令IDIV,以及符号位从字节扩展到字的指令CBW 和从字扩展到双字的指令CWD。
3.BCD 码的调整指令主要有非压缩的BCD 码加法调整指令DAA,压缩的BCD 码减法调整指令DAS,非压缩的BCD 码加法调整指令AAA,非压缩的BCD 码减法调整指令AAS,乘法的非压缩BCD码调整指令AAM,除法的非压缩BCD 码调整指令AAD。
8088/8086 指令系统提供了实现加、减、乘、除运算的上述基本指令,可对下表所示的数据类型进行数据运算。
四、实验内容与步骤1、对于两组无符号数,087H 和034H,0C2H 和5FH,试编程求这两组数的和差积商,并考虑计算结果对标志寄存器中状态标志位的影响。
设计流程:源代码:DATAS SEGMENTARRAY DW 087H,034H,0C2H,05FHJIA DW 2 DUP(?) ;储存两组加法结果JIAN DW 2 DUP(?) ;储存两组减法结果CHENG DW 2 DUP(?) ;储存两组乘法结果CHU DW 2 DUP(?) ;储存两组除法结果DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV SI,0MOV BX,0SUB BX,2SUB SI,4L1:ADD SI,4ADD BX,2MOV AX,ARRAY[SI] ;第一个运算数ADD AX,ARRAY[SI+2] ;加法运算MOV JIA[BX],AX ;储存加法结果MOV AX,ARRAY[SI]SUB AX,ARRAY[SI+2] ;减法运算MOV JIAN[BX],AX ;储存减法结果MOV AX,ARRAY[SI]MUL ARRAY[SI+2] ;乘法运算MOV CHENG[BX],AX ;储存乘法结果MOV AX,ARRAY[SI]MOV CX,ARRAY[SI+2]DIV CL ;除法运算MOV CHU[BX],AX ;储存除法结果CMP BX,2JNZ L1MOV AH,4CHINT 21HCODES ENDSEND START程序结果:通过-t逐步运行程序,逐步查看每次运算后标志位的状态,结果如下:2、在数据段定义了两个多精度的有符号16 进制数,FIRST 和SECOND ,1)求两数的和与差,并将结果存放在THIRD 为首地址的缓冲区中;2)如果把两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在FORTH 为首地址的缓冲区中。
1、你自已决定是否需要有正负。
就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。
如果这个量不会有负值,那么我们可以定它为带正负的类型。
在计算机中,可以区分正负的类型,称为有符类型,无正负的类型(只有正值),称为无符类型。
数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。
字符类型也分为有符和无符类型。
比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。
2、使用二制数中的最高位表示正负。
首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。
不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。
字符类型固定是1个字节,所以最高位总是第7位。
(红色为最高位)单字节数:1111 1111双字节数:1111 1111 1111 1111四字节数:1111 1111 1111 1111 1111 1111 1111 1111当我们指定一个数量是无符号类型时,那么其最高位的1或0,和其它位一样,用来表示该数的大小。
当我们指定一个数量是无符号类型时,此时,最高数称为“符号位”。
为1时,表示该数为负值,为0时表示为正值。
3、无符号数和有符号数的范围区别。
无符号数中,所有的位都用于直接表示该值的大小。
有符号数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。
我们举一个字节的数值对比:无符号数: 1111 1111 值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20有符号数: 0111 1111 值:127 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。
最新《计算机组成原理》第2章习题答案第⼆章习题解答1.设机器数的字长8位(含1位符号位),分别写出下列各⼆进制数的原码、补码和反码:0,-0,0.1000,-0.1000,0.1111,-0.1111,1101,-1101。
解:2.写出下列各数的原码、补码和反码:7/16,4/16,1/16,±0,-7/16,-4/16,-1/16。
解:7/16=7*2-4=0.01114/16=4*2-4=0.01001/16=1*2-4=0.0001真值原码补码反码7/16 0.0111 0.0111 0.01114/16 0.0100 0.0100 0.01001/16 0.0001 0.0001 0.0001+0 O.0OOO O.0OOO O.0OOO-0 1.0OOO O.0OOO 1.1111-1/16 1.0OO1 1.1111 1.1110-4/16 1.0100 1.1100 1.1011-7/16 1.0111 1.1001 1.10003.已知下列数的原码表⽰,分别写出它们的补码表⽰:[X1]原=O.10100,[X2]原=l.10111。
解:[X1]补=0.10100,[X2]补=1.01001。
4.已知下列数的补码表⽰,分别写出它们的真值:[X1]补=O.10100,[X2]补=1.10111。
解: X1=O.10100, X2=-0.01001。
5.设⼀个⼆进制⼩数X≥0,表⽰成X=0.a1a2a3a4a5a6,其中a1~a6取“1”或“O”:(1)若要X>1/2,a1~a6要满⾜什么条件?(2)若要X≥1/8,a1~a6要满⾜什么条件?(3)若要1/4≥X>1/16,a1~a6要满⾜什么条件?解:(1) X>1/2的代码为:0.100001~0.111111。
a1=1,a2+a3+a4+a5+a6=1。
(2) X≥1/8的代码为:0.001001~0.111111(1/8~63/64)a1+a2=0,a3=1或a1=0,a2=1,或a2=1(3)1/4≥X>1/16的代码为:0.000101~0.01000(5/64~1/4)a1+a2+a3 =0, a4=1,a5+a6=1 或a1+a2=0,a3=1 或a2=1,a1+a3+a4+a5+a6=06.设[X]原=1.a1a2a3a4a5a6(1)若要X>-1/2,a1~a6要满⾜什么条件?(2)若要-1/8≥X≥-1/4,a1~a6要满⾜什么条件?解:(1) X>-1/2的代码为:1.000001~1.011111(-1/64~-31/64)。
计算机中数的表⽰和存储(总结)⼀、⽆符号数和有符号数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)。
c语言有符号和无符号数混合运算《C语言中有符号和无符号数混合运算探讨》在C语言中,有符号和无符号数混合运算可能会引发一些问题,因为这两种类型的数在内部表示上有一些差别。
深入理解有符号和无符号数混合运算的知识对于程序员来说至关重要。
本文将对此进行全面评估,并探讨这一主题。
一、有符号和无符号数的内部表示在C语言中,有符号数和无符号数在内部的表示方式不同。
有符号数使用补码表示,而无符号数则直接使用二进制表示。
这种差异在进行混合运算时可能会导致一些问题。
二、混合运算可能产生的问题1. 数据类型转换当有符号数和无符号数进行混合运算时,如果它们的数据类型不一致,C语言会进行自动类型转换。
这可能导致意想不到的结果,因为有符号数和无符号数的表示范围不同。
2. 符号位扩展在有符号数和无符号数进行混合运算时,有符号数会被自动转换为无符号数,这可能导致符号位扩展的问题。
符号位扩展会改变数值的意义,从而产生错误的结果。
3. 数据溢出由于有符号数和无符号数的表示范围不同,混合运算可能导致数据溢出的问题。
如果程序员不注意这一点,就可能导致程序运行出现不确定的结果。
三、解决方法1. 明确数据类型在进行混合运算时,程序员应该明确数据类型,避免不同数据类型之间的隐式转换。
这可以通过类型转换来实现。
2. 注意符号位在进行混合运算时,注意符号位的情况。
程序员应该了解有符号数和无符号数的表示方式,以免出现符号位扩展的问题。
3. 防止数据溢出程序员应该在进行混合运算之前,对参与运算的数值范围有一个清晰的认识,避免数据溢出的发生。
四、个人观点和理解有符号和无符号数混合运算是C语言中一个容易被忽视的细节,但却有着重要的影响。
在我的编程实践中,我曾经遇到过因为忽视了有符号和无符号数混合运算的问题而导致程序出现错误的情况。
我深刻意识到了对这一主题的重视和深入理解的必要性。
只有在深入理解了有符号和无符号数混合运算的知识后,我们才能编写出更加健壮和可靠的程序。
无符号数据若干问题一、总论计算机中数据表示分两种格式:定点格式、浮点格式。
目前计算机中大多数定点数只用于表示整数数据定点数只用于表示整数数据定点数只用于表示整数数据,,而小数则通过浮点数据表示实现而小数则通过浮点数据表示实现。
在定点数据表示中,若所有的位都表示数值含义,则该数为无符号数据,通常为正数。
如用8位表示无符号整数,即0000 0000~1111 1111,表示值为0~255。
若数据表示的最高位代表符号含义,则该数为有符号数据,通常用补码表示。
浮点数一般认为是带符号的。
二、运算计算机运算电路是按有符号数的补码表示运算规则设计的,在数据运算的时候并不区分操作数是有符号的还是无符号的。
如:1000 0010+1111 1000——————1 0111 1010如果把这两个数理解为有符号数-126和-8相加,按补码加法规则,进位丢去,得到结果122是错的,因为产生了溢出。
如果把两个操作数理解为无符号数130和248相加,考虑进位,结果为122+256=378,结果正确(不考虑进位,结果也溢出)。
如果把这两个数理解为-126减8,结果溢出。
理解为无符号数130减8,结果122正确不溢出。
三、标志位计算机的运算器在做完计算之后,设置相应标志位。
最高位产生的进位需结合指令功能设置进位标志,若为加法指令,最高位产生的进位设置为进位标志;若为减法指令,最高位产生的进位取反后设置为进位标志。
计算机中对CF 的置值的置值,,从无符号数运算角度从无符号数运算角度,,有进位置1,无进位置0;有借位置1,无借位置0。
从电路运算角度从电路运算角度,,当电路最高位向前有进位1时,若执行的是加法指令若执行的是加法指令,,对CF 置1,若执行的是减法指令若执行的是减法指令,,对CF 清0;当电路最高位向前进位0时,若执行的是加法指令若执行的是加法指令,,对CF 清0,若执行的是减法指令若执行的是减法指令,,对CF 置1。