关于C语言数据类型选择的一个注意

来源:互联网 发布:淘宝怎么刷关键词排名 编辑:程序博客网 时间:2024/06/12 20:26

  很久之前买了《C Primer Plus》回来学C语言,刚开始看的时候,觉得前面的讲数据类型的那章的题目简单,就没有去做,学到后面感觉前面的有点陌生了,就回来做一下题去复习一下知识点。(看过这本书的人应该都有一种感受,这本书每一章的内容都比较的厚实,讲的都比较细致,基本上与那一章的主要内容有关的知识点都会被提及,对入门的人来说这可以省掉很多调错的麻烦。)结果做到第六题时,怎么修改和编译都有问题。
这道题目的内容如下:
  1个水分子的质量约为3.0e-23克。1夸脱水大约是950克。编写一个程序,提示用户输入水的夸脱数,并显示水分子的数量。
我的初始代码如下:

#include<stdio.h>#define K 950#define M 3.0e-23int main(void){    int N = 0;    float m = 0.0, MK =0.0;    printf("请输入水的夸脱数:\n");    scanf("%f", &MK);    m = MK * K;    N = m / M;    printf("这些夸脱水含有%d个水分子\n", N);    return 0;}

修改后的代码如下:

#include<stdio.h>#define K 950#define M 3.0e-23int main(void){    float N = 0;    float m = 0.0, MK =0.0;    printf("请输入水的夸脱数:\n");    scanf("%f", &MK);    m = MK * K;    N = m / M;    printf("这些夸脱水含有%e个水分子\n", N);    return 0;}

对比一下,可能觉得是数据类型有问题,刚开始用的是整型int,而后面改为浮点型float。
  而导致这个问题的原因,我最开始认为是我的整型int的范围不够,后面我有试着改成了系统支持的最大整型unsigned long long,发现编译结果溢出为零,才发现这个数字过大,最大范围也不够。这时,我不得不更改为float型,才能够容下这个数据。这个例子让我知道了,一般相关的值与值的数据类型应该要相互对应好,这样一般可以避免范围不够造成的程序数据溢出。
  另外,其中的代码中N的数据类型与m除以M后的结果的数据类型是完全不同的,N的整型,m除以M的结果是浮点型,这里就存在一个类型强制转化的风险,特别是浮点型转化为整型,会造成数据的丢失,结果不够精确。
  总结就是:数据类型对应好,溢出bug不上门。

原创粉丝点击