程序设计范式测验一
我们软件工程卓越班这学期的 9-17 周开设了《程序设计范式》课程,这门课程是廖浩德老师引入的斯坦福大学的《编程范式》。该课程的英文版可在 51CTO 学习。
https://edu.51cto.com/center/course/lesson/index?id=2258
该课程主要讲授数据类型的内存布局、泛型及其实现、 汇编实现、编译和链接、并发程序设计、函数式程序设计等。 就我个人而言,在这门课中收获很大,使我对计算机的底层更加了解,对知识达到了知其然,知其所以然的地步。由于这门课没有最终的期末考试,所以每周都会有测验,作为期末成绩的参考,本文主要记录第一次测验的题目以及解析。
1、-64.25 的二进制位模式(IEEE 754 标准,32位)是?
答案:1100 0010 1000 0000 1000 0000 0000 0000
2、 -2.75 的二进制位模式(IEEE 754 标准,32位)是?
答案:1100 0000 0011 0000 0000 0000 0000 0000
这两道题比较简单,属于热身题,主要考察浮点数的机器级表示,下图是浮点数在内存中的存储格式:
实数值 = S 1.X * 2^(E – 127)
- 指数部分:E = 实际指数 + 127(0111 11112)。对于无符号,8 位表示的最大数是全 1,即 255,255 - 127 为 128。8 位表示的最小数是全 0,即 0,0 - 127 为 -127。
- 尾数部分:最左边位的权值为 2^-1,往右数第 2 位权值为 2^-2, ……,最后 1 位的权值为 2^-23。能表示的最小数是全 0,即实数 0.0。能表示的最大数是全 1,即 0.9……(每位乘以其权值加起来的结果相当于 1 减去2^-23,即 1 - 1/8388608 = 1 - 0.0000001192 = 0.9999998808)。
3、int 型数据转换为 short 型:对于 int 型位模式 0000 1000 0000 0010 0000 0100 0000 1100 复制到 short 型空间,表示的十进制整数为?
答案:1036
这个题考察强制类型转换时,会精度精度,因为 int 类型占 4 个字节,而 short 类型占 2 个字节,所以 short 只解析低 16 位 0000 0100 0000 1100,转换成十进制为 1036.
4、
float d = 3.1415926;
unsigned char *p = (unsigned char *)&d;
d 的二进制位模式为:0100 0000 0100 1001 0000 1111 1101 1010
在小端模式下,p + 2 处的字节表示的是 ASCII 字符?
答案:I
这道题我做错了,其实很简单,p 就是 d 低 8 位对应的地址,p + 2 就是 d 17-24 位对应的地址,对应的二进制位模式为 0100 1001,十进制为 73,对应的 ASCII 为 I。
5、
int i = 35;
float f = *(float *)&i;
变量 f 的二进制位模式是?
答案:0000 0000 0000 0000 0000 0000 0010 0011
35 的二进制位模式为 0000 0000 0000 0000 0000 0000 0010 0011,把它以浮点数的形式解析,再取出应该是一个非常小的数,但是二进制位模式不变,还是 0000 0000 0000 0000 0000 0000 0010 0011。
6、
struct mytype{
char a;
char b;
short c;
int d;
};
一个 mytype 类型的变量 m,各分量初值分别为:a 为 ‘a’,b 为 ‘b’,c 为 2,d 为 4。((mytype *)&m.c)->a
的值为(十进制表示,小端模式)?
这段代码的意思将 c 变量的地址作为一个新结构体的起始地址,因为 a 对应的结构体的第一个元素,它为 char 类型,占一个字节,取出 a 的值的意思是取出结构体第一个字节上的值,因为新结构体的前两个字节为旧结构体的 c 对应的地址,而 c 的值为 2,在小端的机器中表示为 10 00 00 00 00 00 00 00,取第一个字节就是 10 00 00 00,对应的值就是 2。
答案:2
7、
int a[4];
a[0] = 0;
a[1] = 1;
a[2] = 2;
a[3] = 3;
((short *)a)[4] = 4;
((short *)(((char *)(&a[1])) + 2))[2] = 2;
最后 a[2] 的位模式是(小端模式)?
答案:0000 0000 0000 0010 0000 0000 0000 0100
这道题比较有意思,也不难,仔细一点就能想出,((short *)a)[4] = 4;
表示将 a[2] 的前两个字节赋值为 4,((char *)(&a[1])) + 2)
表示读取 a[1] 第一个字节,然后加二,也就是读 a[1] 的第三个字节,最后以 short 类型解析,第二个 short 数组的元素赋值为 2,也就是 a[2] 的后两个字节,两者共同操作后,a[2] 的位模式为 0000 0000 0000 0010 0000 0000 0000 0100。