注:以下代码仅供参考,该博客为个人自学C语言的学习记录。如有代码或其他错误的地方请各位大佬批评指正。
1.通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢、浮点数上溢和浮点数下溢的情况。
相关知识:在《C Primer Plus(第六版)》中对上溢和下溢的定义是这样的:
上溢:当计算导致数字过大,超过当前类型能表达的范围时,就会发生上溢。
下溢:以十进制为例,把一个由4位有效数字的数(如:0.1234E-10)除以10,得到的结果是 0.0123E-10。虽然得到了结果,但计算过程中损失了原末尾有效位上的数字,这种情况叫作下溢。
接下来上代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//浮点数上溢
int main() {
//当计算导致数字过大,超过当前类型能表达的范围时,就会发生上溢。
//float类型的长度是4个字节,数值范围为 -3.4E+38 到3.4E+38。
//这个例子是书中的
float toobig = 3.4E38 * 100.0f;
float toobig1 = 3.4E38 * 2;
printf("%e\n", toobig); //运行结果:inf(具有无穷的含义)
printf("%e\n", toobig1); //运行结果:inf(具有无穷的含义)
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//浮点数下溢
int main() {
//在计算过程中损失了原末尾有效位上的数字,这种情况叫做下溢。
//书中摘抄:把最小的正浮点数除以2将得到一个低于正常的值。如果除以一个非常大的值,会导致所有的位都为0。
float toosmall = 0.4E-50 / 100.f;
printf("%e\n",toosmall); //运行结果:0.000000e+00
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <limits.h> //该文件专门用于检测整型数据类型的表达值范围
//整型的上溢和下溢
int main(){
//short的范围为: -32768 —— 32767
printf("short的范围为: %hd —— %hd\n", SHRT_MIN, SHRT_MAX);
//上溢
short up = 32767;
printf("%hd", up+1); //-32768
//下溢
short down= -32768;
printf("%hd", down-1); //32767
return 0;
}
以下是个人关于整数上溢和下溢的理解:
整数的上溢和下溢就像时钟一样,时钟里有12个刻度,一个刻度表示一个小时,当时钟的时针从1点转到12点时,刚好转完一圈,此时已经是时针的最大值12(相当于整数的最大值),那么当时针转到12点之后,它不会转到13点,因为根本没有13点,所以时针只能继续循环,再从1点转到12点。
上溢和下溢也是如此,当所定义的数超过了该数据类型的最大值,那么就会回到该数据类型的最小值;如果所定义的数太小了,比该数据类型的最小值还小,最小值前面已经没数了,所以就回到了最大值,就像圆一样周而复始。
也可以通过数据结构里的循环队列(当队满时,某个位置可能既是头指针,又是尾指针)来更好的理解。
2.编写一个程序,要求提示输入一个ASCII码值(如,66),然后打印输入的字符。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
char a;
//获取用户的输入
printf("输入一个ASCII码值:");
scanf("%d", &a);
printf("该值所对应的ASCII码为%c\n",a);
return 0;
}
3.编写一个程序,发出一声警报,然后打印下面的文本:
Startled by the sudden sound, Sally shouted,
"By the Great Pumpkin, what was that!"
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
printf("\a"); //该转义字符可以发出警报声
printf("Startled by the sudden sound, Sally shouted,\n");
//\"--使用转义字符打印出引号
printf("\"By the Great Pumpkin, what was that!\"");
return 0;
}
4.编写一个程序,读取一个浮点数,先打印成小数点形式,再打印成指数形式。然后,如果系统支持,再打印成p记数法(即十六进制记数法)。按以下格式输出(实际显示的指数位数因系统而异):
Enter a floating-point value: 64.25
fixed-point notation: 64.250000
exponential notation: 6.425000e+01
p notation: 0x1.01p+6
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
float a;
//读取一个浮点数
printf("Enter a floating-point value: ");
scanf("%f", &a);
//打印成小数点形式
printf("fixed-point notation:%f\n",a);
//打印成指数形式
printf("exponential notation:%E\n", a);
printf("exponential notation:%e\n",a);
//打印成p计数法(即十六进制计数法)
//如果系统支持十六进制格式的浮点数,可用a和A分别代替e和E
printf("p notation:%A\n", a);
printf("p notation:%a\n", a);
return 0;
}
5.一年大约有3.156×10 7 秒。编写一个程序,提示用户输入年龄,然后显示该年龄对应的秒数。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
float sec = 3.156E+7;
float totalSec;
int age;
printf("请输入您的年龄:");
scanf("%d", &age);
totalSec = sec * age;
printf("该年龄对应的秒数为:%f", totalSec);
return 0;
}
6.1个水分子的质量约为3.0×10 −23 克。1夸脱水大约是950克。编写一个程序,提示用户输入水的夸脱数,并显示水分子的数量。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
float waterQuantity = 3.0e-23; //水分子质量
float inputNum; //输入的数--水的夸脱数
float waterNum; //水分子数量
printf("请输入水的夸脱数:");
scanf("%f", &inputNum);
waterNum = inputNum * 950 / waterQuantity;
printf("水分子的数量为:%e", waterNum);
return 0;
}
7.1英寸相当于2.54厘米。编写一个程序,提示用户输入身高(/英寸),然后以厘米为单位显示身高。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
float heighInch,heighcm;
printf("请输入您的身高(单位:英寸):");
scanf("%f", &heighInch);
//1英寸等于2.54厘米
heighcm = heighInch * 2.54;
printf("您的身高为%f厘米。", heighcm);
return 0;
}
8.在美国的体积测量系统中,1品脱等于2杯,1杯等于8盎司,1盎司等于2大汤勺,1大汤勺等于3茶勺。编写一个程序,提示用户输入杯数,并以品脱、盎司、汤勺、茶勺为单位显示等价容量。思考对于该程序,为何使用浮点类型比整数类型更合适?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
float cupNum;
printf("请输入杯数:");
scanf("%f", &cupNum);
float pint = cupNum / 2;
printf("以品脱为单位:%f\n", pint);
float ounce = cupNum * 8;
printf("以盎司为单位:%f\n", ounce);
float bigspoon = ounce * 2;
printf("以大汤勺为单位:%f\n", bigspoon);
float teaspoon = bigspoon * 3;
printf("以茶勺为单位:%f\n", teaspoon);
return 0;
}
使用浮点类型比整数类型计算出来的值更准确
如果使用整数类型在做相关运算(例如除法运算)时只能得到整数
例如:如果用户输入的数值为“7”,那么当换算为品脱单位(此时品脱被定义为int类型)时,得到的数值为“3”,但准确的值应该为“3.5”,所以使用浮点类型比整数类型更合适。