欢迎光临散文网 会员登陆 & 注册

【C Primer Plus第六版中文】 课后习题 第三章 3.11编程练习(个人总结版)

2023-07-30 22:31 作者:Airy-1  | 我要投稿

(前言:,本文章由个人收集相关资料且撰写而成,初心是在学习中做笔记,供个人学习使用) 

1. 通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢、浮点数上溢以及浮点数下溢的情况

这三个样例代码会因为编译器和计算机硬件的不同而有所不同,但基本概念和现象是相同的。

我用的是VS2022版本,64位windows系统

a. 整数上溢:


整数上溢样例-可运行代码


b. 浮点数上溢:


浮点数上溢样例-可运行代码


c. 浮点数下溢:


浮点数下溢样例-可运行代码

补充知识点:

(一)

 1. **数据类型大小**:不同硬件平台上,数据类型的大小可能会有所不同。例如,在32位系统上,整数数据类型 int 通常为4字节,而在64位系统上,它通常为8字节。如果在不同平台上使用相同的代码,但数据类型大小不一致,可能会导致数据溢出。

 2. **字节序**:计算机硬件有两种字节序,即大端序和小端序。大端序是将高位字节存储在低地址,小端序是将低位字节存储在低地址。如果代码在一个平台上按照一种字节序编写,然后在另一个平台上运行,可能会导致数据在存储和读取时顺序不一致,从而导致数据溢出。

 3. **浮点数精度**:不同硬件平台上的浮点数运算可能有不同的精度。例如,一些平台上使用 IEEE 754 标准来表示浮点数,而另一些平台可能使用其他方法。如果代码在一个平台上进行了浮点数运算,然后在另一个平台上运行,可能会导致精度丢失,从而导致数据溢出。

 4. **处理器指令集**:不同的处理器可能支持不同的指令集和指令集扩展。如果代码使用了特定平台上的特殊指令或指令集扩展,但在其他平台上并不支持,可能会导致代码运行时出现错误或数据溢出。

 5. **硬件架构**:不同硬件架构的处理器可能有不同的寻址空间和内存管理方式。如果代码假设特定硬件架构的内存地址分布,但在其他硬件架构上运行,可能会导致内存访问错误,从而导致数据溢出。

 综上所述,计算机硬件在数据类型大小、字节序、浮点数精度、处理器指令集和硬件架构等方面的差异可能导致代码数据溢出的不同情况。因此,在开发跨平台的代码时,需要特别注意这些差异,以确保代码在不同硬件平台上都能正确运行,并避免数据溢出等问题。

(二)

解:浮点数上溢时输出结果为 "inf" 是因为浮点数的表示范围是有限的,当一个浮点数的绝对值超过了它所能表示的最大值时,它就会变成正无穷或负无穷,用字符串表示为 "inf" 或 "-inf"。

 在C语言中,浮点数上溢的情况通常用 IEEE 754 标准中定义的特殊值来表示,它表示无穷大。IEEE 754 标准规定,当一个浮点数的指数部分超过浮点数表示范围时,这个浮点数就被认为是无穷大。

 在例子中,我们将一个很大的浮点数 `3.4e38` 乘以2,这超过了浮点数表示范围,因此结果变成了正无穷,用字符串 "inf" 来表示。实际上,"inf" 是一个特殊的浮点数值,代表正无穷大。

 需要注意的是,由于计算机对浮点数的表示是近似的,所以正无穷也可能用其他表示形式,例如 "INF" 或 "Infinity",具体表现取决于编译器和计算机系统的不同。但无论如何,它们都代表了浮点数上溢的情况。


2. 编写一个程序,要求提示输入一个ASCII码值(如66),然后打印输入的字符。

样例代码

3. 编写一个程序,发出一声警报,然后打印下面的文本:

Startled by the sudden sound, sally shouted,

“By the Great Pumpkin, what was that!”


目的就在于简单使用蜂鸣警报 \a

样例代码


4. 编写一个程序,读取一个浮点数,先打印成小数点形式,再打印成指数形式。然后如果系统支持,再打印成p计数法(即十六进制计数法)。


样例代码


#include <stdio.h>

int main() {

    double num;

    printf("请输入一个浮点数:");

    scanf("%lf", &num);

    // 打印成小数点形式

    printf("小数点形式:%f\n", num);

    // 打印成指数形式

    printf("指数形式:%e\n", num);

    // 打印成p计数法(十六进制计数法)

    printf("p计数法:%a\n", num);

    return 0;

}


5. 一年大约有3.156×107秒。编写一个程序,提示用户输入年龄,然后显示改年龄对应的秒数。


个人编写代码初始版本


这是我编写的相关代码,经过AI修改后,下方为修改补充的代码。


修改后代码

在使用 scanf_s 函数时,需要指定 %d 的宽度为 sizeof(ages),因为 scanf_s 是安全的输入函数,需要确保输入的数据不会导致缓冲区溢出。


6.  1个水分子的质量约为3.0×10-23克。1夸脱水大约是950克。编写一个程序,提示用户输入水的夸脱数,并显示水分子的数量。


样例代码


7.  1英寸相当于2.54厘米。编写一个程序,提示用户输入身高(/英寸),然后以厘米为单位显示身高。

样例代码

8. 在美国的体积测量系统中,1品脱等于2杯,1杯等于8盎司,1盎司等于2大汤勺,1大汤勺等于3茶勺。编写一个程序,提示用户输入杯数,并以品脱、盎司、汤勺、茶勺为单位显示等价容量。(思考对于该程序,为何使用浮点类型更合适?)

样例代码


【C Primer Plus第六版中文】 课后习题 第三章 3.11编程练习(个人总结版)的评论 (共 条)

分享到微博请遵守国家法律