程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。
关系表达式 0 == 0U –1 < 0 –1 < 0U 2147483647 > –2147483647 – 1 2147483647U > –2147483647 – 1 2147483647 > (int) 2147483648U –1 > –2 (unsigned) –1 > –2 运算类型 无符号整数 有符号整数 无符号整数 有符号整数 无符号整数 有符号整数 有符号整数 无符号整数 结果 1 1 0 1 0 1 1 1 00…0B = 00…0B 11…1B (–1) < 00…0B (0) 11…1B (232–1) > 00…0B(0) 011…1B (231–1) > 100…0B (–231) 011…1B (231–1) < 100…0B(231) 011…1B (231–1) > 100…0B (–231) 11…1B (–1) > 11…10B (–2) 11…1B (232–1) > 11…10B (232–2) 说明
9.以下是一个C语言程序,用来计算一个数组a中每个元素的和。当参数len为0时,返回值应该是0,
但是在机器上执行时,却发生了存储器访问异常。请问这是什么原因造成的,并说明程序应该如何修改。 1 float sum_elements(float a[], unsigned len) 2 { 3 int i; 4 float result = 0; 5 6 for (i = 0; i <= len–1; i++) 7 result += a[i]; 8 return result; 9 }
参考答案:
参数len的类型是unsigned,所以,当len=0时,执行len-1的结果为11…1,是最大可表示的无符号数,因而,任何无符号数都比它小,使得循环体被不断执行,引起数组元素的访问越界,发生存储器访问异常。 只要将len声明为int型,或循环的测试条件改为i 10. 设某浮点数格式为: 数符 尾数 阶码 6位补码 5位移码 1位 其中,移码的偏置常数为16,补码采用一位符号位,基数为4。 (1) 用这种格式表示下列十进制数:+1.7,–0.12,+19,–1/8。 (2) 写出该格式浮点数的表示范围,并与12位定点补码整数表示范围比较。 参考答案:(假定采用0舍1入法进行舍入) (1) +1.7 = +1.1011001B = 0.011011B× 41, 故阶码为1 +16 = 17 = 10001B, 尾数为+0.011011的补码, 即0.011011,所以+1.7表示为0 10001 011011。 –0.12 = – 0.000111101B = – 0.011111B × 4–1, 故阶码为–1 + 16 =15 = 01111B, 尾数为– 0.011111 的补码,即1.100001, 所以–0.12表示为1 01111 100001。 +19 = +10011B = 0.010011B× 43,故阶码为3 + 16 = 19 = 10011B, 尾数为0.010011,所以+19表 示为0 10011 010011。 –1/8 = – 0.125 = – 0.001B = – 0.100000 × 4–1,阶码为–1 + 16 = 15 = 01111B,尾数为– 0.100000的补码,即1.100000,所以–1/8表示为1 01111 100000。 (2)该格式浮点数表示的范围如下。 正数最大值:0.111111B × 411111,即:0.333× 415 (≈230≈109) 正数最小值:0.000001B × 400000,即:0.001× 4–16 (≈2–34≈10–10) 负数最大值:–0.000001B × 400000,即:–0.001× 4–16 负数最小值:–1.000000B × 411111,即:–1.000× 415 因此,该格式浮点数的数量级在10–10~109之间。 12位定点补码整数的表示范围为:–211~+(211–1),即:–2048~2047 由此可见,定点数和浮点数的表示范围相差非常大。 11. 下列几种情况所能表示的数的范围是什么? (1) 16位无符号整数 (2) 16位原码定点小数 (3) 16位补码定点小数 (4) 16位补码定点整数 (5) 下述格式的浮点数(基数为2,移码的偏置常数为128) 数符 尾数 阶码 1位 8位移码 7位原码 参考答案: (1)无符号整数:0~216–1。 (2)原码定点小数:–(1–2–15)~ +(1–2–15)。 (3)补码定点小数:–1~+(1–2–15)。 (4)补码定点整数:–32768~+32767。 (5)浮点数:负数:–(1–2–7)×2+127~–2–7×2–128。 正数:+2–135~(1–2–7) ×2+127。 12. 以IEEE754单精度浮点数格式表示下列十进制数。 +1.75,+19,–1/8,258 参考答案: +1.75 = +1.11B = 1.11B × 20, 故阶码为0+127=01111111B, 数符为0,尾数为1.110…0,小数点前为隐藏位,所以+1.7表示为0 01111111 110 0000 0000 0000 0000 0000,用十六进制表示为3FE00000H。 +19 = +10011B = +1.0011B × 24,故阶码为4+127 = 10000011B, 数符为0,尾数为1.00110…0,所以+19表示为0 10000011 001 1000 0000 0000 0000 0000,用十六进制表示为41980000H。 –1/8 = – 0.125 = – 0.001B = – 1.0 × 2–3,阶码为–3+127 = 01111100B,数符为1,尾数为1.0…0,所以–1/8表示为1 01111100 000 0000 0000 0000 0000 0000,用十六进制表示为BE000000H。 258=100000010B=1.0000001B × 28, 故阶码为8+127=10000111B, 数符为0,尾数为1.0000001,所以258表示为0 10000111 000 0001 0000 0000 0000 0000,用十六进制表示为43810000H。 13.设一个变量的值为4098,要求分别用32位补码整数和IEEE 754单精度浮点格式表示该变量(结果 用十六进制表示),并说明哪段二进制序列在两种表示中完全相同,为什么会相同? 参考答案: 4098 = +1 0000 0000 0010B = +1. 0000 0000 001 × 212 32位2-补码形式为:0000 0000 0000 0000 00010000 0000 0010(00001002H) IEEE754单精度格式为:0 100010110000 0000 0010 0000 0000 000 (45801000H) 粗体部分为除隐藏位外的有效数字,因此,在两种表示中是相同的序列。 14.设一个变量的值为–2147483647,要求分别用32位补码整数和IEEE754单精度浮点格式表示该变量(结果用十六进制表示),并说明哪种表示其值完全精确,哪种表示的是近似值。 参考答案: –2147483647 = –111 1111 1111 1111 1111 1111 1111 1111B = –1.11 1111 1111 1111 1111 1111 1111 1111 × 230 32位2-补码形式为:1000 0000 0000 0000 0000 0000 0000 0001 (80000001H) IEEE 754单精度格式为:1 10011101 1111 1111 1111 1111 1111 111 (CEFFFFFFH) 32位2-补码形式能表示精确的值,而浮点数表示的是近似值,低位被截断 15.下表给出了有关IEEE 754浮点格式表示中一些重要数据的取值,表中已经有最大规格化数的相应内 容,要求填入其他浮点数的相应内容。(注:表中a代表一个在1到10之间的正纯小数) 单精度 项目 阶码 尾数 以2的幂次表示的值 0 1 最大规格化数 最小规格化数 最大非规格化数 最小非规格化数 +∞ NaN 双精度 以2的幂次表示的值 0 1 (2–2–52)×21023 1.0×2–1022 (1–2–52)×2–1022 2–52×2–1022 – – 以10的幂次表示的值 0 1 a×10308 a×10–308 a×10–308 a×10–? – – 以10的幂次表示的值 0 1 a×1038 a×10–38 a×10–38 a×10–44 – – 00000000 01111111 11111110 00000001 00000000 00000000 11111111 11111111 0?.00 0?.00 1?11 0?.00 1?11 0?01 0?.00 非全0 0 1 (2–2–23)×2127 1.0×2–126 (1–2–23)×2–126 2–23×2–126=2–149 – – 16.已知下列字符编码:A=100 0001,a=110 0001,0=011 0000,求E、e、f、7、G、Z、5的7位ACSII码和第一位前加入奇校验位后的8位编码。 参考答案: E的ASCII码为?A? + (?E?–?A?) = 100 0001 + 100 = 100 0101, 奇校验位P = 0,第一位前加入奇校验位 后的8位编码是0 100 0101。 e的ASCII码为‘a’+ (?e?–?a?) = 110 0001 + 100 = 110 0101,奇校验位P = 1, 第一位前加入奇校验位 后的8位编码是1 110 0101。 f的ASCII码为‘a’+ (?f?–?a?) = 110 0001 + 101 = 110 0110, 奇校验位P = 1, 第一位前 加入奇校验 位后的8位编码是 1 110 0110。 7的ASCII码为‘0’+ (7 - 0) = 011 0000 + 111 = 011 0111,奇校验位P = 0, 第一位前加入奇校验位后 的8位编码是0 011 0111。 G的ASCII码为‘A’+ (?G?–?A?) = 100 0001 + 0110 = 100 0111, 奇校验位P = 1, 第一位前加入奇校验位后的8位编码是1 100 0111。 Z的ASCII码为‘A’+(?Z?–?A?) = 100 0001 + 11001 = 101 1010, 奇校验位P = 1, 第一位前加入奇校验位后的8位编码是 1 101 1010。 5的ASCII码为‘0’+(5 – 0) = 011 0000 + 101 = 011 0101,奇校验位P = 1, 第一位前加入奇校验位后的8位编码是 1 011 0101。 17.假定在一个程序中定义了变量x、y和i,其中,x和y是float型变量(用IEEE754单精度浮点数表 示),i是16位short型变量(用补码表示)。程序执行到某一时刻,x= –0.125、y=7.5、i=100,它们都被写到了主存(按字节编址),其地址分别是100,108和112。请分别画出在大端机器和小端机器上变量x、y和i在内存的存放位置。 参考答案: –0.125 = –0.001B = –1.0 ×2-3 x在机器内部的机器数为:1 01111100 00…0 (BE00 0000H) 7.5= +111.1B= +1.111×22 y在机器内部的机器数为:0 10000001 11100…0 (40F0 0000H) 100=64+32+4=1100100B i在机器内部表示的机器数为:0000 0000 0110 0100(0064H) 大端机 小端机 地址 内容 内容 100 BEH 00H 101 00H 00H 102 00H 00H 103 00H BEH 108 40H 00H 109 F0H 00H 110 00H F0H 111 00H 40H 112 00H 64H 113 64H 00H 18.假定某计算机的总线采用奇校验,每8位数据有一位校验位,若在32位数据线上传输的信息是8F 3C AB 96H,则对应的4个校验位应为什么?若接受方收到的数据信息和校验位分别为87 3C AB 96H和0101B,则说明发生了什么情况,并给出验证过程。 参考答案: 传输信息8F 3C AB 96H展开为1000 1111 0011 1100 1010 1011 1001 0110,每8位有一个奇校验位,因此, 总线上发送方送出的4个校验位应该分别为0、1、0、1。 接受方的数据信息为87 3C AB 96H,展开后为1000 0111 0011 1100 1010 1011 1001 0110;接收到的校验 位分别为0、1、0、1。在接受方进行校验判断如下: 根据接收到的数据信息计算出4个奇校验位分别为1、1、0、1,将该4位校验位分别和接收到的4位校 验位进行异或,得到1、0、0、0,说明数据信息的第一个字节发生传输错误。对照传输前、后的数据信息,第一字节8FH变成了87H,说明确实发生了传输错误,验证正确。