从零开始的嵌入式生活:c语言中的小数和数据类型转换

从零开始的嵌入式生活:c语言中的小数和数据类型转换,第1张

一、C语言中的小数

小数分为整数部分和小数部分,它们由点号.分隔,例如 0.0、75.0、4.023、0.27、-937.198 -0.27 等都是合法的小数,这是最常见的小数形式,我们将它称为十进制形式

此外,小数也可以采用指数形式,例如 7.25×10^2、0.0368×10^5、100.22×10^-2、-27.36×10^-3 等。任何小数都可以用指数形式来表示

C语言同时支持以上两种形式的小数。但是在书写时,C语言中的指数形式和数学中的指数形式有所差异。

C语言中小数的指数形式为:

aEn 或 aen

a 为尾数部分,是一个十进制数;n 为指数部分,是一个十进制整数;E或e是固定的字符,用于分割尾数部分和指数部分。整个表达式等价于 a×10n。

指数形式的小数举例:

  • 2.1E5 = 2.1×10^5,其中 2.1 是尾数,5 是指数。
  • 3.7E-2 = 3.7×10^-2,其中 3.7 是尾数,-2 是指数。
  • 0.5E7 = 0.5×10^7,其中 0.5 是尾数,7 是指数。

C语言中常用的小数有两种类型,分别是 float 或 double;float 称为单精度浮点型占用4个字节,double 称为双精度浮点型占用8个字节

小数的输出

小数也可以使用 printf 函数输出,包括十进制形式和指数形式,它们对应的格式控制符分别是:

  • %f 以十进制形式输出 float 类型;
  • %lf 以十进制形式输出 double 类型;
  • %e 以指数形式输出 float 类型,输出结果中的 e 小写;
  • %E 以指数形式输出 float 类型,输出结果中的 E 大写;
  • %le 以指数形式输出 double 类型,输出结果中的 e 小写;
  • %lE 以指数形式输出 double 类型,输出结果中的 E 大写;
  • %g 会对比小数的十进制形式和指数形式,以最短的方式来输出

%f 和 %lf 默认保留六位小数,不足六位以 0 补齐,超过六位按四舍五入截断

以指数形式输出小数时,输出结果为科学计数法;也就是说,尾数部分的取值为:0 ≤ 尾数 < 10

在进制转换中提到过由于小数部分的转换算法,有许多小数是无法成功换算的,会导致有些时候无法精确输出

将整数赋值给 float 变量时会变成小数

#include 

int main(void)
{
    float a = 0.302;
    float b = 128.101;
    double c = 123;
    float d = 112.64E3;
    double e = 0.7623e-3;
    float f = 1.13201451398;
    float  n = 0.00001;
    float m = 12.84;

    printf("a=%e\nb=%f\nc=%lf\nd=%lE\ne=%lf\nf=%f\nn=%g\nm=%g\n", a, b, c, d, e, f,n,m);

    return 0;
}

运行结果:

a=3.020000e-01
b=128.100998
c=123.000000
d=1.126400E+05
e=0.000762
f=1.132015
n=1e-05
m=12.84

 小数和整数间的相互赋值

将整数赋值给小数类型,只需要在小数点后面加0就可以了

将小数赋给整数类型的话则是需要完全舍弃掉小数部分,不是四舍五入,是完全舍弃

例如 int a =1.9999 得到的结果是 a=1

二、数据类型转换

数据类型间的转换低位(字节数短)转换成高位(字节数长)是合法的 系统默认强制转换

整数:char->short->int->long(unsigned char->unsigned short->unsigned int->unsigned long)

小数:float->double

但是如果你是从高位转换为低位的话,就会发生数据丢失

丢失法则:从低到高获取到对应低数据类型的位后,高位数据全部不要

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/3002675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存