第一节 数据类型
一、数制及相互转换
数据类型.mp4
8086/8088宏汇编语言源程序中允许使用二进制数、八进制数、十进制数和十六进制数。在书写不同数制的数时,常在一个数的尾部用一个字母来表示该数的数制。二进制数用字母B(Binary),八进制数用字母O(Octal),十进制数用字母D(Decimal),十六进制数用字母H(Hexadecimal)。其中,十进制数尾部字母D可缺省。汇编程序在对源程序进行汇编时,能自动将不同数制的数转换成二进制数。
不同进制数之间的对应关系如表2-1所示。
表2-1 不同进制数之间的对应关系
在编写或阅读程序时,常需要将一种进制数转换为另一种进制数。熟练掌握不同进制数之间的转换,是进行汇编语言程序设计的基础。
1. N进制数转换为十进制数
转换方法:按权相加。
【例2.1】 求10011.101B的十进制值。
10011.101B=1×24+1×21+1×20+1×2–1+1×2–3=16+2+1+0.5+0.125=19.625D
八进制、十六进制与十进制之间的转换,除基数不同外,方法一样。
2. 十进制数转换为N进制数
转换方法:整数部分,除基(N)取余;小数部分,乘基(N)取整。
【例2.2】 求十进制数325.8125的二进制表示。
整数部分:
得:325D=101000101B
小数部分:
得:0.8125D=0.1101B
于是:325.8125D=101000101.1101B
3. 二进制数转换为八进制数或十六进制数
转换方法:由于八进制数、十六进制数和二进制数的基数成倍数关系,转换较为简单,方法是将二进制数从小数点开始分别向左向右每3位分成一组(转换成八进制数时)或每4位分成一组(转换成十六进制时),不足3位(或4位)的补0,然后写出对应的八进制数或十六进制数即可。
【例2.3】 将10110.11B转换成十六进制数
4. 八进制数或十六进制数转换为二进制数
转换方法:将每位八进制数写成对应的3位二进制数,每位十六进制数写成对应的4位二进制数即可。
二、计算机中数和字符的表示
(一)计算机中数的表示方法
计算机处理的数据通常是带符号数,即有正数和负数的区别,如+1101,+0.1101,-1101,-0.1101。在计算机中,正数与负数如何表示呢?为便于计算机识别与处理,通常用数的最高位来表示数的符号,0表示正数,1表示负数。日常用“+”或“-”表示符号的数叫真值,而在二进制数的最高位设置符号位,把符号加以数值化,这样的数叫机器数。例如:
带符号数的机器数可以用原码、反码、补码3种不同码制来表示,由于补码表示法在加减运算中的优点,现在多数计算机都是采用补码表示法。微机系列机也是采用补码表示法。为此下面将对原码和补码分别进行介绍。
1. 原码表示法
原码是一种比较直观的机器数表示法。用二进制数的最高位表示符号(0表示正数,1表示负数),数的有效值用二进制绝对值表示(与真值相同)。例如,原码表示的整数01101010和11101010,分别对应的真值是+1101010和-1101010。
在原码表示法中,8位带符号二进制数能表示的最大数和最小数是01111111和11111111,即-127和+127。数0有两种形式:00000000和10000000,它们分别对应于+0和-0。
原码表示法的机器数作加减法运算时不太方便。例如,要进行(-5)+7的运算,看起来是作加法,但是两异号数相加实际是进行减法,即作7-5的运算。同理,两异号数相减时,实际是进行加法计算。所以对原码表示法的机器数进行加减运算时,不仅需要程序中指令规定的操作种类(加或减),还要根据两数的符号确定实际的加减操作。加减操作后,要按照一定的规则确定运算结果的符号,例如两异号数相加,运算结果的符号应与绝对值较大的数同号,两异号数相减,运算结果的符号应与被减数同号。
2. 补码表示法
由于原码加减运算时不太方便,因此设想让符号位也作为数的一部分参与运算,使其运算操作简化,无须做过多的判断和处理。补码表示法就具有这一特点。
(1)补码的定义。
带符号数x的补码表示法[x]补可定义如下:
[x]补=M+x
上述定义中,模数M根据机器数的位数而定,如n=8,M=28。这个28正好是机器数(无符号数)产生进位而自动舍去的数。
若X是正数(即X≥0),按照上述定义,模数M和一个正数相加,作为溢出量便自动舍去。因此,正数的补码正好同原码相同。例如,真值X=+00111011B(即+59D),其补码表示:
[+59]补=28+00111011=100000000+00111011=|1|00111011
其中第1位自动舍去。
若X为负数(即X<0),例如真值X=-00111011B(即-59D),其补码表示:
[-59]补=28+(-00111011)=100000000-00111011=11000101
从上述两个例子可以看出:用补码表示的机器数,符号位仍然表示数的符号(0为正数,1为负数);对于正数,补码和原码一样,与真值的有效数等同;但对于负数,补码经过变换后,已是另一编码形式,它与真值的有效数已不能等同视之。
(2)补码表示法中数的范围。
在补码表示法中,当N=8时,最大的正数仍是[127]补 = 01111111,而数0只有一个,即[0]补=00000000,没有+0与-0的区别。[-127]补=10000001,而10000000却是[-128]补,11111111是[-1]补。所以当n=8时,用补码表示数的范围是-128~+127,如表2-2所示。不难推导出,当n=16时,用补码表示数的范围是-32768~+32767。
表2-2 补码表示的数(n=8)
(3)由原码变换为补码。
由于正数的原码和补码的机器数一样,所以这里主要是讨论负数的变换。把一个负数的原码变换为补码的方法是:首先保持符号位不变(因为符号位已表示为负数),然后将有效数各位变反,最低位加1即可。例如:
所以,
[-59]补=11000101
再看一个例子:
设X=-25 = -19H = -0011001B
则X的8位补码表示为:[X]补=11100111B = E7H
X的16位补码表示为: [X]补=1111111111100111B = FFE7H
从这个例子可以看出X的16位补码实际上是其8位补码的符号扩展。由此得出一个重要结论:一个二进制补码数的符号位(最高位)向左扩展若干位后,仍是该数的补码。
(二)二进制编码
1. 十进制数的二进制编码(BCD码)
8086/8088指令支持十进制数的运算,那么十进制数在机器内部也必须用二进制表示,即用十进制数的二进制编码表示。常用的是BCD码。BCD码与十进制数的对应关系如表2-3所示。
表2-3 BCD码与十进制数的对应关系
例如,十进制数368写成BCD码为:
0011 0110 1000
2. 字符编码
在计算机中,数码、英文字母、标点符号及其他符号统称为字符。字符在计算机中也都是用二进制表示的。现在计算机中通常采用的字符编码是ASCII码(American Standard Code for Information Interchange)。标准的ASCII码在一个字节中用七位二进制表示字符编码,用一位(最高位)表示奇偶校验位(Parity bit),如图2-1所示。
图2-1 ASCII字符编码
标准ASCII码共有128个字符(见附录E),可分为二类:非打印ASCII码和可打印ASCII码。
(1)非打印ASCII码:这类编码属于控制性代码,共33个。例如:BEL(响铃,07H),DEL(删除,7EH),CR(回车,0DH),LF(换行,0AH)等。
(2)可打印ASCII码:共有95个。例如:数字0~9的编码为30H~39H;大写字母A~Z的编码为41H~5AH;小写字母a~z的编码为61H~7AH;空格(space)的编码为20H。
三、数据类型
1. 无符号二进制数
字节数据:取值范围为0~255。
字数据:取值范围为0~65535。
双字数据:取值范围为0~4294967295。
2. 有符号二进制数(补码)
字节数据:一位符号,7位量值,范围为-128~+127。
字数据:一位符号,15位量值,范围为-32768~+32767。
双字数据:一位符号,31位量值,范围为-2147483648~+2147483647。
3. 无符号十进制数(BCD)
十进制数(即BCD码)有压缩(组合)和非压缩(非组合)两种,如图2-2所示。
图2-2 无符号十进制数
BCD的特点是用4位二进制数表示1位十进制数,每4位二进制数之间的进位是十进制数的形式。
4. 浮点数
不同的汇编程序对浮点数约定可能有些不同,但其基本结构是类似的,它们都是由阶码和尾数两个部分组成。
例如,8086/8088宏汇编程序以用DD伪指令定义的浮点数(单精度实数)约定如图2-3所示。
图2-3 浮点数表示
在存储浮点数时,阶码在高地址一端,尾数以二进制原码形式存放,占三个字节,它的最高位总是有效数字,因此,它被隐藏起来,取而代之的是尾数的符号。浮点数在运算时要把最高位的有效数字恢复才能进行运算。
阶码表示2的指数值。它决定了小数点在有效数字(尾数)中的位置。阶码占一个字节,采用过余码形式,即用80H表示阶码为0,大于80H表示正阶码,小于80H表示负阶码。例如,阶码为3时用83H表示,阶码为-3时用7DH表示。
四个字节浮点数的范围是:
正数:2127×(1-2-24)~2-127×2-1。
负数:2127×(-(1-2-24))~2-128×(-2)-1。
零:阶码和尾数同时为0。
5. 字符串
字符串是一种顺序邻接的数据单位。由于计算机处理的信息涉及各种字符,这些字符都必须用二进制形式来表示,因此,字符也是数据。在Intel处理器中,字符用ASCII码表示,每个字符占一个字节,字符数据的使用给人和计算机交互带来了很大方便。
例如,当从键盘上输入字串123ABC时,它们立即被转换成与之对应的ASCII码31H,32H,33H,41H,42H,43H。又如,当用户需要在显示器上显示或在打印机上打印程序运行结果4270时,只要将它逐一转换成对应的ASCII码存放在内存中,然后送给显示器(或打印机)即可。在高级语言中,这一转换工作往往由系统完成,而不需要用户处理。但在汇编语言中,这一工作只能由用户编程来完成。为了区别数值数据,程序中的字符都要以单引号或双引号括起来。