C语言的double和int

#include<stdio.h>
int main(void)
{
double d;
printf("Enter a single digit: ");
scanf("%lf", &d);
printf("The digit entered is %i\n", d);
return 0;
}

输出的为什么会是0??

#include<stdio.h>

int main(void)

{

 double d;

 printf("Enter a single digit: ");

 scanf("%lf", &d);

 printf("The digit entered is %i\n", (signed int)d);

     return 0;

}

如果在输出的时候加上强制转换的话,输出的就是正确结果,可能是由于原数据类型是双精度浮点,但是却以%i(有符号整数)格式化,转换的时候发生不可预料的结果。

再说明白一点,上图好了 

图中是用gdb调试你的代码,输入为4的时候,我们查看堆栈用这个浮点数6的存储方式(x/8bf后面加地址为按字节显示内存地址的值,显示8字节),double类型占用空间为8个字节,可以看到这8个字节前6个都为0,那么很好理解,当你按照%i(有符号整数)格式化的时候,无论是有符号还是无符号整型数在表达式中都会按照int类型来处理(自动类型提升),也就是说在一般int类型为32为长度的机器上,这个8字节的double数会被截断,取前4个字节.

这样说是不是很清晰了?楼主可以再做个实验,你输入一个浮点数看看(如3.4),结果会显示多少?肯定不是0.而是一个很大的数,因为3.4的浮点数的前4位不为0而且还很大,关于双精度浮点数在内存种的具体存储方式,以及prinf函数的内部机制,楼主可以关注下

温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-10-03
int main(void)
{
double d;
printf("Enter a single digit: ");
scanf("%lf", &d);
printf("The digit entered is %d\n", (int)d);
return 0;
}
这么写就出来了
第2个回答  2009-10-03
%i 是什么意思?
你要什么样的输出格式?
你要输出浮点型就用%lf阿,整形就用%d,要去点浮点数的小数点后面多余的0就用%g
%i 没见过阿!
第3个回答  2009-10-04
%i是什么啊?没听说过
第4个回答  2009-10-03
%i是什么啊?没听说过
相似回答