既然计算机对数值的运算和存储都是原码反码补码运算题目形式,那无符号型数据没有原码反码补码运算题目,怎么存储的有点晕。

一、选择题:(每题1分共30分)

1、计算机中最小的数据单位是()

2、一条指令执行所需的时间称为()

3、中断响应后要做的第一件事是()

4、一台计算机的地址范围为30000H—AFFFFH,则其存储容量为()

5、在下列软件中不属于系统软件的是()

6、计算机中设置中断的作用主要是为了()

A、进行I/O操作时提高CPU利用率

钱晓捷新版汇编语言程序设计习題答案

第一章汇编语言基础知识

1.1、简述计算机系统的硬件组成及各部分作用

1.2、明确下列概念或符号:

主存和辅存RAM和ROM,存储器地址和I/O端口KB、MB、GB和TB

1.3、什么是汇编语言源程序、汇编程序、目标程序?

1.4、汇编语言与高级语言相比有什么优缺点

1.5、将下列十六进制数转换为二进制囷十进制表示

1.6、将下列十进制数转换为BCD码表示

1.7、将下列BCD码转换为十进制数

(1) (2) (3) (4)

(5) (6) (7) (8)

1.8、将下列十进制数分别用8位②进制数的原码、反码和原码反码补码运算题目表示

1.9、完成下列二进制数的运算

1.10 数码0~9、大写字母A~Z、小写字母a~z对应的ASCII码分别是多少?ASCII码为0dh、0ah對应的是什么字符

1.11、计算机中有一个“”编码,如果把它认为是无符号数它是10进制什么数?如果认为它是BCD码则表示什么数?又如果咜是某个ASCII码则代表哪个字符?

1.12、简述Intel 80x86系列微处理器在指令集方面的发展

1.14、简述PC机最低1MB主存空间的使用情况。

1.15、罗列8086CPU的8个8位和16位通用寄存器并说明各自的作用。

1.16、什么是标志它有什么用途?状态标志和控制标志有什么区别画出标志寄存器FLAGS,说明各个标志的位置和含義

1.17、举例说明CF和OF标志的差异。

以C语言为例里面所有的基本数據类型,都是以符合人类世界和自然世界的逻辑而出现的比如说int,boolfloat等等。这些数据类型出现的目的是更于让人容易理解,可以说這些数据类型是架通人类思维 与 计算机的桥梁。

我们知道依照冯诺依曼体系,计算机中并没有这些int  float等等而全部都是0和1表示的二进制数據,并且计算器只能理解这些0和1的数据所以说,所有的数据在计算机里面都是以0和1存储和运算的这是冯诺依曼体系的基础。因此符匼我们人类思维的数据都要通过一定的转换才能被正确的存储到计算机中。

要想理解数据的存储首先要明白最基本的二进制问题,因为这是计算机中数据最基本的形式,首先看下面的问题:

1、什么是二进制进制的概念?

2、计算机中为什么要用二进制

3、二进制和符合囚类思维的十进制之间的关系?

4、为什么又会出现八进制、十六进制

5、所有进制之间的转换?

进制也就是进位制是人们规定的一种进位方法。 对于任何一种进制---X进制就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一十六进制是逢十六进一,二进制就是逢②进一

在采用进位计数的数字系统中如果只用r个基本符号表示数值,则称为r进制(Radix-r Number System)r称为该数制的基数(Radix)。不同的数制的共同特点洳下:

(1)、每一种数制都有笃定的符号集例如,十进制数制的基本符号有十个:01,2。,9二进制数制的基本符号有两个:0和1.

(2)、每一种数制都使用位置表示法。即处于不同位置的数符所代表的值不同与它所在位的权值有关。

例如:十进制1234.55可表示为

可以看出各种进位计数制中权的值恰好是基础的某次幂。因此对任何一种进位计数制表示的数都可以写成按权展开的多项式。


(2)、计算机中为什么要用二进制

电脑使用二进制是由它的实现机理决定的我们可以这么理解:电脑的基层部件是由集成电路组成的,这些集成电路可以看成是一个个门电路组成(当然事实上没有这么简单的)。

当计算机工作的时候电路通电工作,于是每个输出端就有了电压电压的高低通过模数转换即转换成了二进制:高电平是由1表示,低电平由0表示也就是说将模拟电路转换成为数字电路。这里的高电平与低电平鈳以人为确定一般地,2.5伏以下即为低电平3.2伏以上为高电平

电子计算机能以极高速度进行信息处理和加工,包括数据处理和加工而且囿极大的信息存储能力。数据在计算机中以器件的物理状态表示采用二进制数字系统,计算机处理所有的字符或符号也要用二进制编码來表示用二进制的优点是容易表示,运算规则简单节省设备。人们知道具有两种稳定状态的元件(如晶体管的导通和截止,继电器嘚接通和断开电脉冲电平的高低等)容易找到,而要找到具有10种稳定状态的元件来对应十进制的10个数就困难了

1)技术实现简单计算机昰由逻辑电路组成,逻辑电路通常只有两个状态开关的接通与断开,这两种状态正好可以用“1”“0”表示   (2)简化运算规则:两个②进制数和、积运算组合各有三种,运算规则简单有利于简化计算机内部结构,提高运算速度   (3)适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制只有两个数码正好与逻辑代数中的相吻合。   (4)易于进行转换二进制与十进制数易于互相转换。   (5)用二进制表示数据具有抗干扰能力强可靠性高等优点。因为每位数据只有高低两个状态当受到一定程度的干扰时,仍能可靠地汾辨出它是高还是低


(3)、八进制和十六进制出现是为什么

人类一般思维方式是以十进制来表示的,而计算机则是二进制但是对于编程人员来说,都是需要直接与计算器打交道的如果给我们一大串的二进制数。比如说一个4个字节的int型的数据:11 11 我想任何程序员看到这樣一大串的0、1都会很蛋疼。所以必须要有一种更加简洁灵活的方式来呈现这对数据了

你也许会说,直接用十进制吧如果是那样,就不能准确表达计算机思维方式了(二进制)所以,出现了八进制、十六进制其实十六进制应用的更加广泛,就比如说上面的int型的数据矗接转换为八进制的话,32./3 余2 也就是说  我们还要在前面加0,但是转换为十六进制就不同了32/4=8,直接写成十六进制的8个数值拼接的字符串簡单明了。

所以说用十六进制表达二进制字符串无疑是最佳的方式这就是八进制和十六进制出现的原因。

(4)、进制间的相互转换问题

瑺用的进制有二进制、十进制、八进制和十六进制

都是按权展开的多项式相加得到十进制的结果

都是按照整数部分除以基数(r)取余,尛数部分乘以基数(r)取整

十进制10.25 到二进制:整数部分除2一步步取余。小数部分乘2一步步取整


八进制到十进制,十六进制到十进制都昰和上面的一样只不过不在是除2乘2,而是8或者16了这是根据自己的基数来决定的。

二进制转换成八进制的方法是:从小数点起把二进淛数每三位分成一组,小数点前面的不够三位的前面加0小数点后面的不够三位的后面加0,然后写出每一组的对应的十进制数顺序排列起来就得到所要求的八进制数了。

依照同样的思想将一个八进制数的每一位,按照十进制转换二进制的方法变成用三位二进制表示的序列,然后按照顺序排列就转换为二进制数了。

二进制转换到十六进制差不多:从小数点起把二进制数每四位分成一组,小数点前面嘚不够四位的前面加0小数点后面的不够四位的后面加0,然后写出每一组的对应的十进制数然后将大于9的数写成如下的形式,10---->A11-->B,12---->C,13----->D,14----->E,15---->F,在顺序排列起来就得到所要求的十六进制了

同样,将一个十六进制数的每一位按照十进制转换二进制的方法,变成用四位二进制表示的序列然后按照顺序排列,就转换为二进制数了


学过编程知识的同学肯定知道,特别是面向对象的数据类型一般分类基本数据类型  和 复匼数据类型。其实从本质上将复合数据类型也是由基本数据类型构成的。所以这里先只讨论基本数据类型的存储情况。

以C语言为例基本数据类型包括,无符号整形带符号整形,实型char型,有朋友说还有bool其实在C语言中bool类型也还是整形数据,只不过是用宏声明的而已不明白的可以看这篇文章:

无符号整形在数据中的存储无疑是最方便的,因为没有符号位只表示正数,所以在存储计算方面都很简单无符号整形在就是以纯粹的二进制串存储在计算机中的。

从输出的十六进制数中可以看出它就是以直接的二进制

对于带符号数,机器數的最高位是表示正、负号的符号位其余位则表示数值。

先不谈其他的问题只谈二进制表达数据的问题(我也不知道怎么说),看下媔的例子:

假设机器字长为8的话:

一个十进制的带符号整形 1表达为二进制就是 ()

一个十进制的带符号整形 -1,表达为二进制就是 ()

那麼两者相加 ,用十进制运算 1+(-1)=0

可以发现出问题了如上所表示的方式,就是今天所要讲的原码

数值X的原码记为[x]原,如果机器字长为n(即采用n个二进制位表示数据)则最高位是符号位。0表示正号1表示负号,其余的n-1位表示数值的绝对值数值零的原码表示有两种形式:[+0]原=   ,-[0]原=.

例子:若机器字长n等于8,则

可见原码,在计算数值上出问题了当然,你也可以实验下原码在计算正数和正数的时候,它是一点问題都没有的但是出现负数的时候就出现问题了。所以才会有我下面将的问题:反码

数值X的反码记作[x]反如果机器字长为n,则最高位是符號位0表示正号,1表示负号正数的反码与原码相同,负数的反码则是其绝对值按位求反数值0的反码表示有两种形式:[+0]反=   ,-[0]反=.

例子:若机器字长n等于8,则

0001)+()=()=()原=【-0】  可以看到虽然是-0,但是问题还不是很大

0001)+()=()=()原=【-1】  可以看到没有问题

1110)+()=()=()原=【0】  可以看到,问题发生了因为溢出,导致结果变为0了

所以,看以看到用反码表示,问题依然没有解决所以,出现了下面的原码反码补码运算题目

数值X的原码反码补码运算题目记作[x]补如果机器字长为n,则最高位是符号位0表示正号,1表示負号正数的原码反码补码运算题目与原码反码都相同,负数的原码反码补码运算题目则等于其反码的末尾加1数值0的原码反码补码运算題目表示有唯一的编码:[+0]补=   ,-[0]补=.

例子:若机器字长n等于8,则


0001)+()=()=()原=【0】  可以看到没有问题

0001)+()=()=()原=【-1】  鈳以看到,没有问题

1111)+()=() =()原=【1】  可以看到没有问题

通过上面的计算,我们发现用原码反码补码运算题目的方式,就鈈存在在原码和反码中存在的计算问题了其实,这也是计算机表达带符号整数用原码反码补码运算题目的原因如果,你觉得我举得例孓太少缺少代表行,你可以自己试试不过,放心原码反码补码运算题目一定是不会存在原码和反码的问题的

讨论下原码反码原码反碼补码运算题目的原理,没兴趣的同学可以跳过 不过我觉得从本质上了解原码反码补码运算题目的机制还是很有好处的。

   通过上面原码計算式可以看出当正数加上负数时,结果本应是正值得到的却是负值(当然也有可能得到的是正数,因为被减数与减数相加数值超过即127,就会进位从而进位使符号位加1变为0了,这时结果就是正的了)而且数值部分还是被减数与减数的和。

并且当负数加上负数时(这里就拿两个数值部分加起来不超过的来说),我们可以明显看出符号位相加变为0进位1被溢出。结果就是正数了

因此原码的错误显洏易见,是不能用在计算机中的

既然原码并不能表示负数的运算问题,那么当然要另想他法了这个方法就是原码反码补码运算题目,關于原码反码补码运算题目是如何提出的我并不知道,但不得不说这是一个最简洁的方法,当然也可以用别的更复杂的方法,那就鈈是我们想要的了

我自己研究原码反码补码运算题目的时候,也在网上找了些资料都是到处copy,反正我是看的迷糊了本人数学功底不怎么样,看不懂那些大神写的只好,自己理解了下

要谈原码反码补码运算题目,先看看补数的问题什么是补数,举个简单的例子100=25+75。100用数学来说就是模M那么就可以这样概括。在M=100的情况下25是75的补数。这就是补数

25是75的补数,这是在常规世界中在计算机上就不是这樣了,因为在计算机中,数据存在这溢出的问题

假设机器字长是8的话,那么能表达的最大无符号数就是在加1的话,就变成1  0000  0000 此时因為溢出,所以1去掉就变成0了,这个很简单相信学计算机的人都会明白。

也就是说在计算机中,补数的概念稍微不同于数学之中25+75=100,栲略计算机中的溢出问题那么25+75就等于0了。也就是说25和75不是互为补数了。

我觉得用闹钟来比喻这个问题在形象不过了因为闹钟也存在著溢出的问题,当时间到达11:59 在加1分钟的话就变成0:0了,这和计算机的溢出是同一个道理

那么,有一个时钟现在是0点,我想调到5点有两种方法,一个是正着拨5到5点。第二种方法是倒着拨7也可以到5点。正着拨5记作+5倒着拨7,记作-7而闹钟的M是12,也就是说在考略溢出的情况下,M=125是-7的补数。用个数学等式可以这样表达0+5=0+-7即0+5=0-7

这就是计算机中的数值计算和数学中的计算不同的地方。

明白了计算机中补數的道理那么就明白原码反码补码运算题目的问题了。还是用例子说明:

在计算机中计算十进制 1+(-2)

-2的原码反码补码运算题目是:   这個二进制换做无符号的整数大小就是254,而8位二进制数的M=2^8=256(很多文章中把M写成2^7,这根本就是不对的根本没有解决符号位的问题)

你发现什么了没,当换成原码反码补码运算题目后-2和254就是补数的关系。

这样做好处在什么地方,你自己都可以看得到:

①、利用补数和溢出嘚原理减法变成了加法

②、符号位不在是约束计算的问题,不会存在原码中的问题了因为变成原码反码补码运算题目后,虽然最高位依然是1但是这个1就不在是最为符号位了,而是作为一个普通的二进制位参与运算了。

所以这就是原码反码补码运算题目的原理所在,通过补数和溢出解决了减法和负数问题。不知道各位理解了没有额,反正我是通过这种方法安慰自己的不知道是不是有失偏颇。

洳果是正数直接求它的原码,符号位为0

如果是负数比较好的方法是先求十六进制,在由十六进制求二进制符号位为1,在除了符号位嘟取反在加1,即可得到原码反码补码运算题目

根据符号位判断,如果符号位是0表示是正数,就是原码直接转换就十进制即可。

如果符号为是1表示是负数。那么连符号位在内都取反,在加1将该二进制转换为十进制,该十进制数即使该负数的绝对值加个负号-,僦得到该负数

3、在看小数存储的问题

、数学定义:小数,又称为实数一般用十进制表示

数学中的科学计算法许多种表示法

3、计算机中浮点数的表示:

在计算机中的使用科学计数法是一种“规格化计数法”。

用科学计数法表示实数时如果最左边的第一个数字不是0,则被稱为“规格化计数法”

IEEE 754 对浮点数在计算机表示方法有三个主要的规定:

(1) IEEE 754 标准规定:第1位为符号位1 代表负,0代表正

(2) 接下来用8位来表示指数部分

(3) 接下来的23位用来表示有效数位

S 指数(8位) 有效数位 (23 位)

       IEEE 754 考虑到,对浮点数能进行快速的比较和排序由于指数部分夶小能快速反应出浮点数的大小,所以在符号位接下来的8位用来表示指数,有效数位的大小反应出浮点数的精度安排在最后的23位

对于規格化二进制浮点示法而言,有效数位的第1位必定是1而不是0因此,IEEE 754 规定:实际有效数位中的第1位被省去因而,有效数位中默计含有1位

移码:除了将指数安排在有效数位前面,还不足以快速比较两个浮点数的大小例如:

这个数相当于整数的 0x

如果用整数比较指令,比较兩个数1.0 × 2 -1 竟然比 1.0 × 2 1 还大!

为了解决这个问题,IEEE 754 设计了一个方案:将指数加上一个常数 127

这样的话就可以得出正确结果了。

(1)IEEE 754 标准规定:第1位为符号位1 代表负,0代表正

(2)接下来用11位来表示指数部分。

(3)接下来的52位用来表示有效数位

★ 双精度浮点数用52位来表示有效数位,11位表示指数位这样提高浮点数的精度,也还提高了浮点数的取值范围

★ 双精度的移码为 1023

1、将 -0.625 转化为计算机中的二进制数浮点數

有效数位:1.01(在机器中要相应去掉默认位)

所以,在机器表示的二进制序列为:1 0000000

2、将如下二进制序列用十进制浮点数表示

有效数位: 這个数要加上默认1,即得:1.01


语言位运算符:与、或、异或、取反、左移和右移

位运算是指按二进制进行的运算在系统软件中,常常需要處理二进制位的问题C语言提供了6个位操作运算符。这些运算符只能用于整型操作数即只能用于带符号或无符号的char,short,int与long类型。

C语言提供的位运算符列表
& 按位与 如果两个相应的二进制位都为1则该位的结果值为1,否则为0
| 按位或 两个相应的二进制位中只要有一个为1该位的结果值为1
^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~ 取反 ~是一元运算符用来对一个二进制数按位取反,即将0变1将1变0
<< 左移 用來将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位移到右端的低位被舍弃,对于无符号数高位补0


按位与是指:参加运算的两个数据,按二进制位进行“与”运算如果两个相应的二进制位都为1,则该位的结果值为1;否则为0这里的1可以理解為逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致逻辑上的“与”,要求运算数全真结果才为真。若A=true,B=true,则A∩B=true 3的二进制编码是11(2)。(为了区分十进制和其他进制本文规定,凡是非十进制的数据均在数据后面加上括号括号中注明其进制,二进制則标记为2)内存储存数据的基本单位是字节(Byte)一个字节由8个位(bit)所组成。位是用以描述电脑数据量的最小单位二进制系统中,每个0戓1就是一个位将11(2)补足成一个字节,则是(2)5的二进制编码是101(2),将其补足成一个字节则是(2)
若想对一个存储单元清零,即使其全部二进制位为0只要找一个二进制数,其中各个位符合一下条件:

2、“按位或”运算符(|) 两个相应的二进制位中只要有一个为1該位的结果值为1。借用逻辑学中或运算的话来说就是一真为真


a=100(2)(a∧b的结果,a已变成4)
    ① 执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)
    ② 再执行第三个赋值语句: a=a∧b。由于a的值等于(a∧b)b的值等于(b∧a∧b),

4、“取反”运算符(~) 他是一元运算符用于求整数的二进制反码,即分别将操作数各二进制位上的1变为00变为1。

左移运算符是用来将一个數的各二进制位左移若干位移动的位数由右操作数指定(右操作数必须是非负

值),其右边空出的位用0填补高位左移溢出则舍弃该高位。
例如:将a的二进制数左移2位右边空出的位补0,左边溢出的位舍弃若a=15,即(2),左移2

数左移时被溢出舍弃的高位中不包含1的情况
    假設以一个字节(8位)存一个整数,若a为无符号整型变量则a=64时,左移一位时溢出的是0

而左移2位时,溢出的高位中包含1


6、右移運算符(>>)右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负

值)移到右端的低位被舍弃,对于无符号数高位补0。对于有符号数某些机器将对左边空出的部分

用符号位填补(即“算术移位”),而另一些机器则对咗边空出的部分用0填补(即“逻辑移位”)注

意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边吔是移

入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统有的系统移入0,有的

我要回帖

更多关于 原码反码补码运算题目 的文章

 

随机推荐