新手学C,请教一个小问题
大家好,新人刚刚开始自学C语言,遇到了一个小问题,想请教各位一下~#include<stdio.h>
int main()
{
printf("%d\n",3/2);
}
运行这段代码,结果为1,因为“ ”中的数据类型为整形,所以小数部分会被省略,这个我能理解。
但是,
#include<stdio.h>
int main()
{
printf("%f\n",3/2);
}
将%d改为%f或%lf时,输出结果为0.000000,这是为什么呢?是因为3和2是整形,然后在计算过程中计算机进行转换出错的原因吗?
做一些小修改,如下,
#include<stdio.h>
int main()
{
printf("%f\n",3.0/2.0);
}
此时得到的结果正确。
想问的就是,为什么在第二种情况下,会得到结果为0.000000呢?
谢谢回答!
"将%d改为%f或%lf时,输出结果为0.000000,这是为什么呢?是因为3和2是整形,然后在计算过程中计算机进行转换出错的原因吗?"
不是转换出错了,是你用错了占位符
int类型不能用%f输出
#include <stdio.h>
int main(void)
{
int num = 3 / 2;
printf("%f\n", num);
printf("%d\n", num);
return 0;
}
0.000000
1
请按任意键继续. . .
因为3和2都是整数,他们相除后默认还是整数,所以3/2后吧小数的部分都省略了,而第二个因为有小数。所以默认结果也是小数,所以3/2的小数部分不会省略。 人造人 发表于 2018-2-23 18:21
"将%d改为%f或%lf时,输出结果为0.000000,这是为什么呢?是因为3和2是整形,然后在计算过程中计算机进行转 ...
明白了,多谢您的指点!本来另外还在纠结的一个点是,为什么相除得到的结果会是0.000000,而不是1.000000之类的,就是不太明白为什么直接清零了。。。 花莹雨澈 发表于 2018-2-24 20:51
明白了,多谢您的指点!本来另外还在纠结的一个点是,为什么相除得到的结果会是0.000000,而不是1.000000 ...
不明白你在问什么
人造人 发表于 2018-2-24 20:54
不明白你在问什么
啊。。。就是为什么这个错误的结果会是“0.000000”,而不是别的结果。不好意思,这个问题貌似是有点奇怪。。。 花莹雨澈 发表于 2018-2-24 21:07
啊。。。就是为什么这个错误的结果会是“0.000000”,而不是别的结果。不好意思,这个问题貌似是有点奇怪 ...
你是问这个代码为什么输出了 0.000000 和 1 吗?
#include <stdio.h>
int main(void)
{
int num = 3 / 2;
printf("%f\n", num);
printf("%d\n", num);
return 0;
}
0.000000
1
请按任意键继续. . .
人造人 发表于 2018-2-24 21:37
你是问这个代码为什么输出了 0.000000 和 1 吗?
{:5_109:}是想问问为什么错误的结果是0.000000,而不是别的数字,比如不是1.000000,也不是乱码什么的,而是输出了0.000000,这是编译器决定的吗? 因为printf把1以浮点数格式解码了
浮点数存储格式
https://www.cnblogs.com/MikeZhang/p/IEEE754FloatEncode20180117.html 好吧,printf并没有把1以浮点数格式解码
#include <stdio.h>
int main(void)
{
int x = 0x42f60000;
printf("%d\n", x);
printf("%f\n", x);
printf("%f\n", *(float *)&x);
return 0;
}
int x = 0x42f60000;
00D5424E C7 45 F8 00 00 F6 42 mov dword ptr ,42F60000h
printf("%d\n", x);
00D54255 8B 45 F8 mov eax,dword ptr
00D54258 50 push eax
00D54259 68 98 6B D5 00 push offset string "%d\n" (0D56B98h)
00D5425E E8 0D D1 FF FF call _printf (0D51370h)
00D54263 83 C4 08 add esp,8
printf("%f\n", x);
00D54266 8B 45 F8 mov eax,dword ptr
00D54269 50 push eax
00D5426A 68 30 6B D5 00 push offset string "%f\n" (0D56B30h)
00D5426F E8 FC D0 FF FF call _printf (0D51370h)
00D54274 83 C4 08 add esp,8
printf("%f\n", *(float *)&x);
00D54277 F3 0F 5A 45 F8 cvtss2sd xmm0,dword ptr
00D5427C 83 EC 08 sub esp,8
00D5427F F2 0F 11 04 24 movsd mmword ptr ,xmm0
00D54284 68 30 6B D5 00 push offset string "%f\n" (0D56B30h)
00D54289 E8 E2 D0 FF FF call _printf (0D51370h)
00D5428E 83 C4 0C add esp,0Ch
至于为什么输出 0.000000
这和printf内部的实现有关 人造人 发表于 2018-2-24 23:53
好吧,printf并没有把1以浮点数格式解码
好的好的,最近没上论坛回复晚了。非常感谢,解释得很清楚,虽然看不懂汇编(上面应该是汇编语言吧{:5_91:}),但是明白是为什么了,感谢!
页:
[1]