欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

程序设计范式测验一

程序员文章站 2022-05-08 11:22:57
...

我们软件工程卓越班这学期的 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。

相关标签: 程序设计范式