1.真值和机器数的关系是什么?
答:在计算机内部用二进制编码表示的数称为机器数,而机器数真正的值(即原来带有正负号的数)称为机器数的真值,所以,它们就是同一个数据的两种不同表示形式。
2.什么是编码?
答:编码是指用少量简单的基本符号,对大量复杂多样的信息进行一定规律的组合。基本符号的种类和组合规则是信息编码的两大要素。例如,用10个阿拉伯数字表示数值、电报码中用4位十进制数字表示汉字等,都是编码的典型例子。计算机内部处理的所有信息都是已“数字化编码”的信息。
3.什么是数字化编码?
答:“数字化编码”就是对感觉媒体信息(如数值、文字、图像、声音、视频等信息)进行定时采样,将现实世界中的连续信息转换为计算机中离散的“样本”信息,然后对这些离散的“样本”信息进行二进制编码。
4.计算机内部为什么用二进制来编码所有信息?
答:主要有以下3个方面的原因。
(1)二进制系统只有两个基本符号“0”和“1”。因此,其基本符号少,易于用稳态电路实现。
(2)二进制的编码、计数和运算等规则简单。
(3)二进制中的“0”和“1”与逻辑命题的“真”和“假”的对应关系简单,为计算机中实现逻辑运算和程序中的逻辑判断提供了便利的条件,特别是能通过逻辑门电路方便地实现算术运算。
5.计算机内部都用二进制表示信息,为什么还要引入八进制和十六进制?
答:计算机内部在进行信息的存储、传送和运算时,都是以二进制形式来表示信息的。但在屏幕上或书本上书写信息时,由于二进制信息位数多,阅读、记忆不方便,而十六进制、八进制和二进制的对应关系简单,又便于阅读、记忆和书写,所以引入十六进制或八进制,使得人们在开发、调试程序和阅读机器内部代码时,能方便地用十六进制或八进制来等价表示二进制信息。
6.如何表示一个数值数据?计算机中的数值数据都是二进制数吗?
答:在计算机内部,数值数据的表示方法有两大类。
(1)直接用二进制数表示。分为无符号数和有符号数,有符号数又分为定点整数表示和浮点数表示。无符号数用来表示无符号整数(如地址等信息);定点整数用来表示带符号整数;浮点数用来表示实数。
(2)采用二进制编码的十进制数(即Binary Coded Decimal Number,BCD码)来表示整数,BCD码的编码方案很多,一般都采用8421码(也称为NBCD码)来表示。
因此,计算机中的数值数据虽然都用二进制来编码表示,但不一定全是二进制数,也可以用十进制数表示。因而有些处理器的指令类型中,就有对应的二进制加法指令和十进制加法指令。
7.为什么要引入无符号数表示?
答:因为有些情况下只要对正整数进行运算,且结果不出现负值,此时,可以用无符号数表示变量。例如,在进行地址或指针运算时可用无符号数。
8.在高级语言程序中定义的unsigned型数据是怎么表示的?
答:unsigned型数据就是无符号数,直接用二进制对数值进行编码得到的就是无符号数。
9.为什么无符号数运算时结果可能会发生“溢出”?什么叫无符号数的“溢出”?
答:计算机的机器字长总是有限的,因而机器数的位数有限,使得可表示的数的个数有限。 n 位二进制数只能表示2 n 个不同的数,当运算结果超过 n 位数时就可能发生溢出。
对于无符号数来说,计算机运算过程中只能保留低 n 位,舍弃高位。这样,会产生以下两种结果。
(1)剩下的低 n 位数不能正确表示运算结果。这种情况意味着运算的结果超出了计算机能表达的范围,有效数值进到了第 n +1位,称此时发生了“溢出”现象。例如,对于4位无符号数相加运算,当计算14+3时就发生溢出,即1110+0011=1 0001,结果中第一位1是数值部分,把这个1丢弃后结果就不对了。
(2)剩下的低 n 位数能正确表达计算结果,即高位的舍去并不影响其运算结果。例如,对于4位无符号数相减运算,当计算14-3时,用14加-3的补码来实现,即1110+1101=1 1011,结果中第一位1不是数值部分,把这个1丢弃后的结果是十进制的11,因此是正确的。
“对一个多于 n 位的数丢弃高位而保留低 n 位数”这种处理,实际上等价于“将这个多于 n 位的数去除以2 n ,然后丢去商保留其余数”的操作。这种操作运算就是“模运算”。在一个模运算系统中,运算的结果最终都是丢弃高位而保留低位。所以,只要不是“溢出”(即只要真正的值不会进到第 n +1位),结果就是正确的。这是模运算系统的特点。
10.为什么现代计算机都用补码来表示整数?
答:和原码、反码相比,用补码表示定点整数时,有以下四个好处:①符号位可以和数值位一起参加运算;②补码可以实现模运算,即可用加法方便地实现减法运算;③零的表示唯一;④可以多表示一个最小负数。因此,现代计算机中都采用补码来表示定点整数。
11. n 位二进制补码整数的模是多少?数的表示范围是什么?
答: n 位二进制补码整数的模是2 n ,表示其运算结果只保留低 n 位,多于 n 位的高位部分取模后要被丢弃掉,其数值范围为-2 ( n -1) ~[+2 ( n -1) -1]。
12.在C语言程序中,关系表达式“-2147483648==2147483648U”的结果为什么为“真”?
答:关系表达式“-2147483648==2147483648U”的左边是负数,右边是正数,因此,左右两数看似不等,结果似乎应该为“假”。但是,在C语言中,如果在一个表达式中同时有unsigned int(无符号整数)类型和int(带符号整数)类型数据,那么,C编译器会隐含地将int型数据强制类型转换为无符号整数。在上面的关系表达式运算中,对于左边的数“-2147483648”,编译器会先把2147483648转换为机器数“1000 0000 0000 0000 0000 0000 0000 0000”,然后将负号“-”转换为一条“取负指令”,得到对应的机器数还是“1000 0000 0000 0000 0000 0000 0000 0000”,被解释成无符号整数,其值为2 31 ,和右边的无符号整数“2147483648U”的值完全相同,因而结果为“真”。
13.定点整数在数轴上分布的点之间都是等距的吗?
答:是的。定点整数在数轴上的点总是在整数值上,即[…,-5,-4,-3,-2,-1,0,1,2,3,4,5,…],相邻数据间隔总是1。
14.为什么要引入浮点数表示?
答:因为定点数不能表示实数,而且表数范围小,所以要引入浮点数表示。
15.为什么浮点数的阶(指数)要用移码表示?
答:因为在浮点数的加减运算中,要进行对阶操作,需要比较两个阶的大小。移码表示的实质就是把阶加上一个偏置常数,使得所有数的阶码都是一个正整数,比较大小时,只要按高位到低位的顺序比较即可,因而,引入移码可以简化阶的比较过程。
16.浮点数如何表示0?
答:用一种专门的位序列表示0,例如,IEEE 754单精度浮点数中,用“0000 0000H”表示+0,用“8000 0000H”表示-0。当运算结果出现阶码过小时,计算机将该数近似表示为0,称为“机器零”。
17.现代计算机中采用什么标准来表示浮点数?
答:早期的计算机各自采用不同的浮点数表示格式,因而,在不同计算机之间进行数据交换时,就会发生数据不统一的问题。所以,专门制定了IEEE 754标准用来规定计算机中的浮点数表示格式。现代计算机中都采用IEEE 754标准来表示浮点数。
18.为什么浮点数要采用规格化形式表示?
答:为了使浮点数中能尽量多地表示有效位数,提高浮点数运算的精度,而且规格化形式具有唯一性。
19.如何判断一个浮点数是否是规格化数?
只要看转换为真值后,其尾数的第一位是否一定是非零数。因此,对于原码编码的尾数来说,只要看尾数的数值部分第一位是否为1即可。
20.浮点数表示的精度和数值范围取决于什么?
答:浮点数的精度取决于尾数的位数,而数值范围取决于阶码的位数。在浮点数总位数不变的情况下,阶码位数越多,则尾数位数越少,即表数范围越大,则精度越差(数变稀疏)。
21.基数的大小对表数范围和精度有什么影响?
答:基数越大,则范围越大,但精度变低(数变稀疏)。
22.在高级语言编程中,float和double型数据是怎么表示的?
答:现代计算机用IEEE 754标准表示浮点数,其中32位单精度浮点数就是float型,64位双精度浮点数就是double型。
23.在高级语言编程中,long double型数据是怎么表示的?
答:long double型数据的长度和格式随编译器和处理器类型的不同而有所不同。例如,Microsoft Visual C++6.0版本以下的编译器都不支持该类型,因此,用其编译出来的目标代码中long double和double一样,都是64位双精度;在IA-32上使用gcc编译器时,long double类型数据采用Intel x86 FPU的80位双精度扩展格式[1位符号位s、15位阶码e、1位显式首位有效位(explicit leading significand bit)j和63位尾数f]表示;在SPARC和PowerPC处理器上使用gcc编译器时,long double类型数据采用相应的128位双精度扩展格式(1位符号位s、15位阶码e和112位尾数f,采用隐藏位,故有效位数为113位)表示。
24.C语言程序中,为什么关系表达式“123456789==(int)(float)123456789”的结果为“假”,而关系表达式“123456==(int)(float)123456”和“123456789==(int) (double)123456789”的结果都为“真”?
答:在C语言中,float类型对应IEEE 754单精度浮点数格式,即float型数据的有效位数只有24位(相当于有6、7位十进制有效位数);double类型对应IEEE 754双精度浮点数格式,有效位数有53位(相当于有16、17位十进制有效位数);int类型为32位整数,其有效位数为31位(最大数为2147483647,相当于10位十进制有效位数)。
整数123456789的有效位数为9位,转换为float型数据后肯定发生了有效位数丢失,再转换为int型数据时,已经不是123456789了,所以,关系表达式“123456789==(int)(float)123456789”的结果为假。
数据改为123456后,有效位数只有6位,转换为float型数据后有效位数没有丢失,因而数据没变,再转换为int型数据时,还是123456,所以,关系表达式“123456==(int)(float)123456”的结果为真。
整数123456789的有效位数为9位,转换为double型数据后,不会发生有效位数丢失,再转换为int型数据时,还是123456789,所以,关系表达式“123456789==(int) (double)123456789”的结果为真。
25.位数相同的定点数和浮点数中,可表示的浮点数个数比定点数个数多吗?
答:不是的。可表示的数据个数取决于编码所采用的位数。编码位数一定,则编码出来的数据个数就是一定的。 n 位编码最多只能表示2 n 个数,所以,对于相同位数的定点数和浮点数来说,可表示的数据个数应该一样多。但是,有时由于一个值可能有两个或多个编码对应,编码个数会有少量差异。
26.如何进行BCD码的编码?
答:每位十进制数的取值可以是0、1、2、…、9这十个数之一,因此,每一个十进制数位必须至少有4位二进制位来表示。而4位二进制位可以组合成16种状态,去掉10种状态后还有6种冗余状态,所以从16种状态中选取10种状态表示十进制数位0~9的方法很多,可以产生多种BCD码方案。大的方面可分为有权码和无权码两种。
有权码是指表示每个十进制数位的4个二进制数位(称为基2码)都有一个确定的权,8421码是最常用的十进制有权码;无权码是指表示每个十进制数位的4个基2码没有确定的权。
27.逻辑数据在计算机中如何表示?如何运算?
答:逻辑数据分别用“1”和“0”来表示命题的“真”和“假”。进行逻辑运算时,按位进行。
28.汉字的区位码、国标码和机内码有什么区别?
答:GB2312字符集由94行、94列组成,行号称为区号,列号称为位号,各占7位,共14位,区号在左、位号在右,称为汉字的区位码,它指出了该汉字在码表中的位置。
汉字的国标码是将区号、位号各加上32(即十六进制的20H)后,再在前后7位前各加0。
汉字的内码需要2个字节来表示,可以在国标码的基础上产生汉字机内码,一般是将国标码的两个字节的第一位设置成1。
例如,已知一个汉字的国标码为343AH,前后两个字节各减32(20H)得到区位码,即343AH-2020H=141AH,所以区号为20(14H),位号为26(1AH);机内码是将国标码的两个字节的最前面一位变为1,因此,机内码为B4BAH。
29.MSB(LSB)表示最高(低)有效字节还是最高(低)有效位?
答:MSB的含义可能是最高有效字节(Most Significant Byte),也可能是最高有效位(Most Significant Bit),具体表示哪一个含义,要根据上下文来判断。同样,LSB的含义可能是最低有效字节(Least Significant Byte),也可能是最低有效位(Least Significant Bit)。
30.有时用“字”表示数据的宽度,一个“字”到底有多少位?
答:除了用“比特”(bit)和“字节”(Byte)来表示一个数据的宽度外,有时也用“字”(Word)来表示数据宽度的单位。不同的计算机,其“字”的长度和组成不完全相同,有的由2个字节组成,有的由4个、8个甚至16个字节组成。
31.一个“字”的宽度就是一个“机器字长”吗?
答:不是。“机器字长”是计算机的一个非常重要的指标。我们通常所说的32位机器或64位机器,就是指机器的字长是32位或64位。一般情况下,机器字长定义为CPU中一次能够处理的二进制整数的位数,实际上就是CPU中整数运算数据通路的位数。
“字”作为信息宽度的计量单位,对于某个系列机来说,其字宽总是固定的。例如,在80x86系列中,一个字的宽度为16位,因此,32位是双字,64位是四字。在IBM 303X系列中,一个字的宽度为32位,所以16位为半字,32位为单字,64位为双字。
一个“字”的宽度可以不等于机器字长。例如,在Intel微处理器中,从80386开始就至少都是32位机器了,即机器字长至少为32位,但其字的宽度都定义为16位。
32.在表示存储容量和带宽时经常用到KB、MB、GB、TB等表示数据量的单位,为什么1MB有的时候等于10 6 字节,有的时候又等于2 20 字节呢?
答:当表示二进制存储容量时,度量单位用2的幂次,例如,若主存容量为1GB,则表示主存有2 30 字节。当描述距离、频率等数值时,通常用10的幂次表示,因而在由时钟频率计算得到的总线带宽或外设数据传输率中,度量单位表示的也是10的幂次。例如,若总线带宽为1GB/s,则表示总线每秒传输10 9 字节。为区分这种差别,通常用K表示1024,用k表示1000,而其他前缀字母均为大写,表示的大小由其上下文决定。
在计算硬盘容量或文件大小时,不同的硬盘制造商和操作系统用不同的度量方式,因而比较混乱。在历史上,这甚至引发了一些硬盘买家的诉讼,买家原本预计1MB会有2 20 B、1GB会有2 30 B,但实际容量却只有10 6 B或10 9 B,容量远比自己预计的容量小。为了避免歧义,国际电工委员会(International Electrotechnical Commission,IEC)在1998年给出了表示2的幂的字母定义,即在原来的前缀字母后跟字母i表示2的幂,例如,1GiB=2 30 B,而1GB=10 9 B。