答:采用补码运算具有如下两个特征:
(1)因为使用补码可以将符号位和其他位统一处理,同时,减法也可以按加法来处理,即如果是补码表示的数,不管是加减法都直接用加法运算即可实现。
(2)两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 这样的运算有两个好处:
(a)使符号位能与有效值部分一起参加运算,从而简化运算规则。从而可以简化运算器的结构,提高运算速度;(减法运算可以用加法运算表示出来。)
(b)加法运算比减法运算更易于实现。使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
3)浮点数的表示范围和精确度分别由什么决定?字长一定时浮点数的表示范围与精确度之间有和关系?
答:浮点数的表示范围由阶码的位数决定,精确度由尾数的位数决定。
当机器字长一定时,分给阶码的位数越多,尾数占用的位数就越少,则数的表示范围越大。而尾数占用的位数减少,必然会减少数的有效数位,即影响数的精度。
4)汉字输入码、机内码和字型码在汉字处理过程中各有何作用?
答:汉字输入码、机内码和字型码,分别用于汉字的输入、汉字在计算机内的处理以及汉字的显示和打印。
具体来说,计算机要对汉字信息进行处理,首先要将汉字转换成计算机可以识别的二进制形式并输入到计算机,这是由汉字输入码完成的;汉字输入到计算机后,还需要转换成内码才能被计算机处理,显然,汉字内码也应该是二进制形式。如果需要显示和打印汉字,还要将汉字的内码转换成字形码。
5)在机内码中如何区分两个ASCII码字符和一个汉字?
答:将一个汉字看成是两个扩展ASCII码,使表示GB2312汉字的两个字节的最高位都为1,而每个ASCII码字符中每个字节的最高位为0。这样就能区别一个机内码到底对应一个汉字还是两个西文字符。
6)“8421码就是二进制数”。这种说法对吗?为什么?
答:这种说法是不对的。8421码是一种最简单的有权码,它选取4位二进制数的前10个代码0000~1001分别对应表示十进制数的10个数码。若按权求和,和数就等于该代码所对应的十进制数。
8421码是一种编码方式,用于十进位制与二进制数之间的转换。
而二进制数是用0和1两个数码来表示的数。二者是不同的概念,不能等同。
7)如何识别浮点数的正负?浮点数能表示的数值范围和数值的精确度取决于什么?
答:当采用一般浮点数格式表示浮点数时,阶码和尾数都各包含一位符号位。浮点数的正负由尾数的的符号位决定。当采用IEEE754格式时,通过数符就能判断出浮点数的正负。
浮点数能表示的数值范围和数值的精确度,分别取决于阶码的位数和尾数的位数。
8)简述CRC的纠错原理。
答:发送部件将某信息的CRC码传送至接收部件,接收部件收到CRC码后,仍用约定的生成多项式G(x)去除,若余数为0,表示传送正确;若余数不为0,表示出错,再由余数的值来
确定哪一位出错,从而加以纠正。具体的纠错原理如下:
(1)不论错误出现在哪一位,均要通过将出错位循环左移到最左边的一位上时被纠正; (2)不为零余数的具有循环特性。即在余数后面补一个零除以生成多项目式,将得到下一个余数,继续在新余数基础上补零除以生成多项式,继续该操作,余数最后能循环到最开始的余数。
(3)CRC就是利用不为零余数的循环特性,在循环计算余数的同时,将收到的CRC编码同步移动,当余数循环到等于最左边位出错对应的余数时,表明已将出错的位移到CRC码的最左边,对出错位进行纠错。
(4)继续进行余数的循环计算,并同步移动CRC编码,当余数又回到最开始的值时,纠错后的CRC码又回到了最开始的位置。至此,完成CRC的纠错任务。
写出下列各数的原码、反码和补码。
0, 一0, , 一, , 一, -, 解:
x=0,则[+0]原 = …0 , [+0 ]反= …0,[+0]补 =…0; x=-0,则[-0]原 = …0,[-0]反 = …l,[-0]补 = …0; x=,则[x]原 =,[x]反 =,[x]补 =; x=一,则[x]原 =,[x]反 =,[x]补 =; x=,则[x]原 =,[x]反 =,[x]补 =; x=一,则[x]原 =,[x]反 =,[x]补 =; x=-,则[x]原 =,[x]反 =,[x]补 =; x=,则[x]原 =,[x]反 =,[x]补 =。
已知数的补码表示形式,求数的真值。
[x]补=, [x]补=, [x]补=, [x]补=, [x]补=, [x]补=,
解:
[x]补=,则[x]原=,x=; [x]补=,则[x]原=,x=-; [x]补=,则[x]原=,x=-0; [x]补=,则[x]原=,x=-; [x]补=,则[x]原=,x=; [x]补=,则[x]原=,x=-。
已知x=,y=—,求:
[x/2]补, [x/4]补, [y/2]补, [2y]补
解: [x]原==[x]反=[x]补, 所以[x/2]补=,[x/4]补=; [y]原=,[y]反=,[y]补=, 所以[y/2]补=,[2y]补=。
2.6 C语言中允许无符号数和有符号整数之间的转换, 下面是一段C语言代码: Int x =-1; Unsigned u=48;
Printf (“x=%u=%d\\n”,x,x); Printf (“u=%u=%d\\n”,u,u);
给出在32位计算机中上述程序段的输出结果并分析原因. 解:x=95=-1;u=48=-48
原因:x是int型,在计算机中以补码形式存在。%u以无符号输出,%d输出真值,所以x=95=-1。
31
u=2是一个无符号数,无溢出,由于首位为1 %u符号输出第一位为非符号位,所以是48
31
%d 第一位为符号位,所以是负数,取反加1还是2所以是-48。
分析下列几种情况下所能表示的数据范围分别是多少 1)16位无符号数;
2)16位原码定点小数; 3)16位补码定点小数; 4) 16位补码定点整数; 解:
16
1)16位无符号数:0 ~ 1111 1111 1111 1111,即0 ~ 2-1=65535
-15-15
2)16位原码定点小数: 1111 1111 1111 ~ 1111 1111 1111,即 -(1-2)~ 1-2
-15
3)16位补码定点小数: 0000 0000 0000 ~ 1111 1111 1111,即 -1 ~ 1-2
1515
4) 16位补码定点整数:1000 0000 0000 0000 ~ 0111 1111 1111 1111,即 -2 ~ 2-1
用补码表示8位二进制整数,最高位用一位表示符号(即形如x0x1x2x3x4x5x6x7)时,模应为多少?
解:因为8位二进制数补码的表示范围为:-128~127一共有256个数,所以模为256。
用IEEE754 32位浮点数标准表示十进制数
a)?65 b)3.1415927 c)64000
8解:
a) 首先分别将整数和分数部分转换成二进制数:
5?6= 8移动小数点,使其变成的形式: =*2 于是得到:
S=0, e = 2,E= 10+01111111 = ,M = 10101 最后得到32位浮点数的二进制存储格式为:
1100 0000 1101 0100 0000 0000 0000 0000=(C0D40000)16
b) 首先分别将整数和分数部分转换成二进制数: =
移动小数点,使其变成的形式 =1.×2
2
于是得到:
S=0, e = 1,E= 1+01111111 =,M = 10 最后得到32位浮点数的二进制存储格式为:
0100 0000 0100 1001 0000 1111 1101 1010=(40490FDA)16
c) 首先将6400转换成二进制数: 64000=
移动小数点,使其变成的形式
12
=1.×2 于是得到:
S=0, e = 12,E= 1100+01111111 =,M = 1001 最后得到32位浮点数的二进制存储格式为:
0100 0101 1100 1000 0000 0000 0000 0000=(45C80000) 16
求与IEEE754 32位浮点数H对应的十进制数。 解:
H=(0100 0011 1001 0100 0000 0000 0000 0000)2 S=0,E=()2-127=8,M=
所以表示数为0,对应的十进制数为296。
求32位 IEEE754 浮点数能表示的最大数和最小数。
解:用IEEE754格式(E的取值范围:1~254,留出全0和全1分别表示0和无穷大)
31 30 23 22 0
S E M (1) 最大数的二进制表示:
0 11 即 2(2-2) (2) 最小数的二进制表示:
1 11 即 - 2(2-2)
mn
设有两个正浮点数:N1=2×M1,N2=2×M2。
(1)若m>n,是否有N1>N2?
(2)若M1和M2是规格化的数,上述结论是否正确? 解:(1)不一定。
32
例如,N1=2×,N2=2×,此时m>n,却有N1=N2。
32
再如,N1=2×,N2=2×,此时m>n,却有N1<N2。 (2)正确。
因为浮点数规格化,要求尾数的最高位为非0数码,即当尾数的值不为零时,其绝对值应大于或等于(1/2)10。
那么M1和M2都必须是× × … ×的形式。这时,若m>n,则一定有N1>N2。
设二进制浮点数的阶码为3位,尾数是7位。用模2补码写出它们所能表示的最大正数、
127
-23
127
-23
最小正数、最大负数和最小负数,并将它们转换成十进制数。 解: 补码 真值
3-6
最大正数: 011;, 2×(1-2)
3-6
最小正数: 101;, 2×2
3-6
最大负数: 101;, -2×2
3-6
最小负数: 011;, -2×(1-2)
将下列十进制数表示成浮点规格化数,阶码4位,尾数10位,各含1位符号,阶码和尾数
均用补码表示。
(1)57/128 (2) —69/128 解:(1)57/128=2,记x=,则[x]原=[x]反=[x]补=,
-1
规格化:[x]补=*2
阶码的原码为:1001,因此补码为:1111 尾数为:00
表示成浮点规格化数:1111 00
(2)-69/128=2,记x=,则[x]原=,[x]反=,[x]补=, 无需规格化,阶码为0000,尾数为00 表示成浮点规格化数:0000 00
设有效信息为01011011,分别写出奇校验码和偶校验码。如果接收方收到的有效信息为01011010,说明如何发现错误。 解:奇偶校验位分别为:0和1, 奇校验码:0 偶校验码:0
如果采用奇校验,则发送方发出的奇校验码x=0(前8位是有效信息位,最后一位是校验位), 如果接收方收到的x=0 (只有1位出错,最后一个0是校验位),
接收方按奇校验方式根据01011010计算得到的验位C’=1 ,与从信息中读到得校验码的取值不同,表明传送的信息发生了错误。
如果采用偶校验,利用相似的方法可以发现错误。
由 6 个字符的 7 位 ASCII 编码排列,再加上水平和垂直偶校验位构成如表的行列结构(最后一列为水平奇偶校验位,最后一行为垂直奇偶校验位)
表 ASCII码交叉校验
字符
7 位 ASCII 码
1 X3 1 1 X8 1
HP 0 1 0 1 0 1
3 0 X1 X2 0 0 1 Y1 1 0 0 1 0 0 + X4 1 0 1 0 1 Y2 0 1 X5 X6 1 1 D 1 0 0 X7 1 0 = 0 X9 1 1 1 X10