讨论课实施方法:
每次讨论课布置三道选题,每个班分为六个小组,同一道题有两个小组选择(小组间协商或随机分配)并进行准备。在讨论课时,每道题随机选择一组进行汇报,另外一组或其他组进行质疑与提问。
讨论课的成绩由本组表现及个人表现组成。
第二次讨论课选题
选题一
在c语言中,有许多未定义的操作,例如下面这段代码:
int i=0;
int a[] ={10,20,30};
int r = 1 *a[i++] + 2 * a[i++] + 3 * a[i++];
int j=4;
j=j++;
printf(“r=%d,j=%d”;i,j);
在不同的编译器下结果会有不同。请讨论:
(1)还有哪些类似的“未定义的操作”,举例说明。
(2)从汇编代码来讨论其结果不同的原因。
选题二
对于如下的代码:
#include <stdio.h>
int main()
{
float a[3]={1143139122437582505939828736.0,76482007234779498639230238720.0,9.222452464e-39};
printf("%d\n",sizeof(float));
printf("%s\n",a);
return 0;
}
(1)运行并分析这个程序,解释为什么会输出这样的结果?
(2)如果float a[3]改成int a[3],那么要如何赋值才能得到同样的结果?
(3)编写代码,输入为一个长度小于12的字符串,输出其对应的浮点数数组及整数数组;
(4)进一步讨论,指令其实也是二进制串,那么是否也会存在某个字符串对应着的是一条或多条指令的组合?
选题三
在用IEEE格式来表示浮点数时,有些整数是不能精确表示的,请以32位系统下的float型为例,找出不能精确表示的最小正整数,并深入分析其原因。
并对于n位阶码(4<n<10),m(6<m<20)位尾数的浮点数表示方式,任选一组n,m值,说明如何计算其不能精确表示的最小正整数值。
选题四
在Unix等操作系统中,计时方式是以1970年1月1日 00:00:00为基准,按秒为单位进行增减,并采用一个32位的int型整数来存储这个值。这会导致在手机上设置日期时,无法将日期设置成2038年1月19日之后的日期,请阅读下面文章(原文链接),
对此现象的原因进行详细分析,讨论还会有哪些场合会有类似的问题出现,并给出解决方案。

