程序设计范式测验一

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值