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

  很久之前买了《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不上门。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值