C Primer Plus 第3章 数据和C 编程练习
1、
/* 整数上溢 */ #include <stdio.h> int main(void) { int i = 2147483647; unsigned int j = 4294967295; /* 无符号整数j像一个汽车里程指示表(形容的太好了,可参考《计算机科学导论》第3章 数据存储,有图), 当达到最大值时,它将溢出到起始点。整数i也是同样。它们的主要区别是unsigned int变量j的起始点是0(正像里程 指示表那样),而int变量i的起始点则是-2147483648。——参考《C Primer Plus》 */ printf("%d %d %d\n", i, i+1, i+2); printf("%u %u %u\n", j, j+1, j+2); return 0; }
浮点数上溢和浮点数下溢,于浮点数,以目前的知识最终是无法深究的,故留待以后探索。只能借《C Primer Plus》之意:
当计算结果是一个大得不能表达的数时,会发生上溢。现在C语言要求为这样的数赋予一个代表无穷大的特殊值,以inf或infinity示之。
用对浮点值可用的全部精度进行表示的最小数字(它具有最小的指数,并且仍具有可以由全部可用位进行表示的最小的尾数值),若此数除以2,通常这个操作将使指数部分减小,但是指数已经达到了最小值,所以计算机只好将尾数部分达到位进行右移,空出首位二进制位,并丢弃最后一位二进制位。此过程称为下溢。(举例说之:以十进制为例,把一个包含4位有效数字的数0.1234E-10除以10,将得到结果0.0123E-10,但是损失了1位有效数字)。
/* 浮点数上溢与下溢 */ #include <stdio.h> int main(void) { float toobig = 3.4e38 * 100.0f; float toosmall = 0.1234e-2 / 10; printf("%e\n", toobig); // 输出为inf printf("%f\n", toosmall); // 损失1位有效数字 return 0; }
2、
#include <stdio.h> int main(void) { int ch; printf("请输入一个ASCII码值: "); scanf("%d", &ch); printf("%d相应的字符为: %c", ch, ch); return 0; }
3、
#include <stdio.h> int main(void) { printf("\aStartled by the sudden sound, Sally shouted, "); printf("\"By the Great Pumpkin, what was that! \"\n"); return 0; }
4、
#include <stdio.h> int main(void) { float input; printf("请输入一个浮点数: "); scanf("%f", &input); printf("The input is %f or %e.", input, input); return 0; }
5、
#include <stdio.h> int main(void) { int age; printf("请输入您的年龄: "); scanf("%d", &age); printf("您的年龄合%e秒", age * 3.156e7); return 0; }
6、
#include <stdio.h> int main(void) { int kua; printf("请输入水(单位为夸脱)的夸脱数: "); scanf("%d", &kua); printf("%d夸脱水中包含%e个水分子", kua, kua * 950 / 3.0e-23); return 0; }
7、
#include <stdio.h> int main(void) { float feet; printf("请输入您的身高(单位为英寸): "); scanf("%f", &feet); printf("%.2f inches = %.2f cm", feet, feet * 2.54); return 0; }