float fvalue
double dvalue
scanf("%f", &fvalue) ------------->将标准输入存储到float类型变量
scanf("%lf", &dvalue) ------------>将标准输入存储到double类型变量
现在看,如果用"%f" 来转化存储double类型变量会有什么结果?
scanf("%f", &dvalue) ------------->dvalue的值将不会是你期望的浮点值,多数情况下是0
现在再看 convention specifier:
f ---------- 匹配一个有符号浮点数;下一个指针必须是浮点数梁岁的指针。(那么问题来了,double--8字节,也是浮点数,float--4字节也是浮点数,困惑么?)
再看type modifier:
l --------- 指示convention将会是d,i,o,u,x,X 或者n中的一个并且下一个指针必须是指向长整或橡型或者无符号长整型(而不是4字节的整型),或者指定convention将是e,f或g中的一个并且下一个指针必须是指向double(而不是4字节的float)。
看到这里,我想你已经清楚为何不能用"%f" 来对应double了。
至于衫渣旁为什么会出现这样的情况,是因为标准库对于变参(sscanf/scanf/fscanf的格式化参数是变参)的处理原理。标准库利用va_start/va_arg/va_end 宏来处理变参。其本质是通过指针给你的变量赋值,所以标准库需要知道你的变量的长度。int是4个字节,long int 是8个字节;同样float是4个字节,double是8个字节。试想将8个字节的内存存储的值,以指针 *** 作内存的方式存储到4个字节内存中,会出现什么情况? “截断”,就是“截断”,因为出现了截断,所以你得到的值,只是8个字节中的低MSB或者高MSB的4个字节而已,因此值不是你想要的。
C语言中float浮点型数据类型,FLOAT 数据类型用于存储单精度浮点数或双精度浮点数。浮点数使用 IEEE(电气和电子工程师协会)格式。浮点类型的单精度值具有 4 个字节,包括一个符号位、一个
8 位 excess-127 二进制指数和一个 23 位尾数。
尾数弊蠢表漏塌示一个介于 1.0 和 2.0 之间的数。由于尾数的高顺序位始终为
1,因此它不是以数字形式存储的。此表示形式为 float 类型提供了一个大约在 -3.4E+38 和 3.4E+38 之间的范围。
定义输入输出举例如下:
扩展资料float和double的区别:
1.指数和尾数
由于指数是以无符号形式存储的,因此指数的偏差为其可能值的一半。对于 float 类型,偏差为 127;对于 double 类型,偏差为 1023。可以通过将指数值减去偏差值来计算实际指数值。
2.浮点类型
如果存储比精度更重要,请考虑对浮点变量使用 float 类型。相反,如果精度是最重要的条件,则使用 double 类型。浮点变量可以提升为更大基数的类型(从 float 类型租搜陪到 double 类型)。当您对浮点变量执行算术时,通常会出现提升。此算术始终以与具有最高精度的变量一样高的精度执行。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)