购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.6
分析应用题

1.编写一个C语言程序,通过循环执行结构求自然数1到100的立方和。

【分析解答】

2.已知一个函数原型声明为“float f_max(float, float, float);”,给出该函数的定义,要求能够求出给定3个浮点数中的最大值,并编写一个主函数用来测试各种输入情况下结果的正确性。

【分析解答】

3.在你的机器上运行以下程序,并对程序执行结果进行分析。

【分析解答】

程序执行结果如下:

从数学意义上来看,y和z的值应当相等。但计算机程序中的浮点数只能用有限数量的比特来表示,因此存在精度的概念,有些数值无法用浮点数精确表示和存储,从而引入误差。这些误差会在程序的计算过程中积累,如果对两个浮点型变量进行比较,即使其数学意义上的值应当相等,但可能由于误差的存在,导致两个浮点型变量的存储表示不完全相同。在C语言中,浮点类型double采用IEEE 754双精度浮点数格式表示,相应的十进制有效数字约为17位。程序的第9行和第10行分别输出y和z的数值,从执行结果可见,y和z从第18位有效数字开始有所不同,即分别为0和8。因此,程序中的y和z并不完全相同,第5行的比较结果不成立,故程序通过第8行输出false。

4.在你的机器上运行以下程序,考虑在32位/64位机器上在ISO C90/C99标准的各种组合情况下程序执行结果的不同,参考C语言标准规范对程序执行结果进行分析。

【分析解答】

在32位/64位机器上采用ISO C90/C99标准的各种组合情况下,程序均输出true。

(1)考虑32位机器上采用ISO C90标准的情况。

ISO C90标准规定,对于无后缀的十进制常量的类型,以int、long、unsigned long中第一个可表示的类型为准。在32位机器上,int类型的长度是4字节,表示范围是[-2 31 , 2 31 -1],对于常量2147483647=2 31 -1,其值在int类型的表示范围内,故为int类型。对于常量2147483648=2 31 ,其值不在int类型的表示范围内,故考虑long类型;在32位机器上,long类型的长度是4字节,表示范围与int类型相同,也无法表示2147483648,故考虑unsigned long类型;在32位机器上,unsigned long类型的长度是4字节,表示范围是[0, 2 32 -1],可以表示2147483648,因此,2147483648为unsigned long类型。综上,程序第4行的比较运算符中,左侧为int类型,右侧为unsigned long类型,根据C语言标准,比较前应将左侧提升为unsigned long类型,提升后其真值仍为2147483647,比较结果为“真”,故输出true。

(2)考虑64位机器上采用ISO C90标准的情况。

2147483647的类型与情况(1)一致,仍为int类型。对于2147483648,在考虑long类型时,由于在64位机器上,long类型的长度是8字节,表示范围是[-2 63 , 2 63 -1],可以表示2147483648,因此,2147483648为long类型。综上,程序第4行的比较运算符中,左侧为int类型,右侧为long类型,根据C语言标准,比较前应将左侧提升为long类型,提升后其真值仍为2147483647,比较结果为“真”,故输出true。

(3)考虑32位机器上采用ISO C99标准的情况。

ISO C99标准规定,对于无后缀的十进制常量的类型,以int、long、long long中第一个可表示的类型为准。2147483647的类型与情况(1)一致,仍为int类型。根据上文,对于2147483648,在32位机器上的int类型和long类型均无法表示,故考虑long long类型;由于在32位机器上,long long类型的长度是8字节,表示范围是[-2 63 , 2 63 -1],可以表示2147483648,因此,2147483648为long long类型。综上,程序第4行的比较运算符中,左侧为int类型,右侧为long long类型,根据C语言标准,比较前应将左侧提升为long long类型,提升后其真值仍为2147483647,比较结果为“真”,故输出true。

(4)考虑64位机器上采用ISO C99标准的情况。

2147483647的类型与情况(1)一致,仍为int类型;2147483648的类型与情况(2)一致,为long类型。综上,程序第4行的比较结果与情况(2)一致,输出true。

5.在你的机器上运行以下3个程序,考虑在32位/64位机器上在ISO C90/C99标准的各种组合情况下程序执行结果的不同,参考C语言标准规范对程序执行结果进行分析。

程序一:

程序二:

程序三:

【分析解答】

对于程序一,在32位/64位机器上,在ISO C90/C99标准的各种组合情况下,程序均输出“>10”。由于变量a为unsigned类型,变量b为int类型,故在表达式“a+b>10”中,左侧在进行加法运算前,应先将b提升为unsigned类型,提升后其真值变为2 32 -20=4294967296-20=4294967276。因此,比较运算的左侧结果为a+b=10+4294967276=4294967286,比较结果为“真”,故输出“>10”。上述分析适用于32位/64位机器上在ISO C90/C99标准下的各种组合。

对于程序二,在32位/64位机器上,在ISO C90/C99标准的各种组合情况下,程序均输出“<10”。在表达式“10-20>10”中,10和20均为int类型,故比较运算的左侧结果为-10,比较运算按带符号整数进行,比较结果为“假”,故输出“<10”。上述分析适用于32位/64位机器上在ISO C90/C99标准下的各种组合。

对于程序三,在32位机器上采用ISO C90标准时,程序输出“>10”,其余组合的情况下,程序输出“<10”。

(1)考虑32位机器上采用ISO C90标准的情况。

根据第4题的分析,此时2147483648为unsigned long类型,而10为int类型,故在表达式“10-2147483648>10”中,左侧在进行加法运算前,应先将10提升为unsigned long类型,提升后其真值仍为10。因此,比较运算的左侧按无符号整数减法计算,结果为10-2147483648=2147483658,比较运算也按无符号整数进行,比较结果为“真”,故输出“>10”。

(2)考虑64位机器上采用ISO C90标准的情况。

根据第4题的分析,此时2147483648为long类型,而10为int类型,故在表达式“10-2147483648>10”中,左侧在进行加法运算前,应先将10提升为long类型,提升后其真值仍为10。因此,比较运算的左侧按带符号减法计算,结果为10-2147483648=-2147483638,比较运算也按带符号整数进行,比较结果为“假”,故输出“<10”。

(3)考虑32位机器上采用ISO C99标准的情况。

根据第4题的分析,此时2147483648为long long类型,而10为int类型,故在表达式“10-2147483648>10”中,左侧在进行加法运算前,应先将10提升为long long类型,提升后其真值仍为10。因此,比较运算的左侧按带符号整数减法计算,结果为10-2147483648=-2147483638,比较运算也按带符号整数进行,比较结果为“假”,故输出“<10”。

(4)考虑64位机器上采用ISO C99标准的情况。

根据第4题的分析,此时2147483648为long类型,分析过程与情况(2)相同,程序输出“<10”。 2a+1tPIf8EjQrcs72h9ZUjSlkhmE1jjQH573gLkXKsMQEBsmfKiR0SSpAH/Zrnor

点击中间区域
呼出菜单
上一章
目录
下一章
×