您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-30 23:07 316 查看
  很久之前买了《C Primer Plus》回来学C语言,刚开始看的时候,觉得前面的讲数据类型的那章的题目简单,就没有去做,学到后面感觉前面的有点陌生了,就回来做一下题去复习一下知识点。(看过这本书的人应该都有一种感受,这本书每一章的内容都比较的厚实,讲的都比较细致,基本上与那一章的主要内容有关的知识点都会被提及,对入门的人来说这可以省掉很多调错的麻烦。)结果做到第六题时,怎么修改和编译都有问题。

这道题目的内容如下:

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

我的初始代码如下:

#include<stdio.h>
#define K 950
#define M 3.0e-23
int 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-23
int 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不上门。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: