鱼C论坛

 找回密码
 立即注册
查看: 2805|回复: 10

新手学C,请教一个小问题

[复制链接]
发表于 2018-2-23 18:03:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好,新人刚刚开始自学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呢?

谢谢回答!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-23 18:21:36 | 显示全部楼层
"将%d改为%f或%lf时,输出结果为0.000000,这是为什么呢?是因为3和2是整形,然后在计算过程中计算机进行转换出错的原因吗?"

不是转换出错了,是你用错了占位符
int类型不能用%f输出

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int num = 3 / 2;
  5.         printf("%f\n", num);
  6.         printf("%d\n", num);
  7.         return 0;
  8. }

  9. 0.000000
  10. 1
  11. 请按任意键继续. . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-23 21:46:11 | 显示全部楼层
因为3和2都是整数,他们相除后默认还是整数,所以3/2后吧小数的部分都省略了,而第二个因为有小数。所以默认结果也是小数,所以3/2的小数部分不会省略。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-2-24 20:51:15 | 显示全部楼层
人造人 发表于 2018-2-23 18:21
"将%d改为%f或%lf时,输出结果为0.000000,这是为什么呢?是因为3和2是整形,然后在计算过程中计算机进行转 ...

明白了,多谢您的指点!本来另外还在纠结的一个点是,为什么相除得到的结果会是0.000000,而不是1.000000之类的,就是不太明白为什么直接清零了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-24 20:54:53 | 显示全部楼层
花莹雨澈 发表于 2018-2-24 20:51
明白了,多谢您的指点!本来另外还在纠结的一个点是,为什么相除得到的结果会是0.000000,而不是1.000000 ...

不明白你在问什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-24 21:07:09 | 显示全部楼层
人造人 发表于 2018-2-24 20:54
不明白你在问什么

啊。。。就是为什么这个错误的结果会是“0.000000”,而不是别的结果。不好意思,这个问题貌似是有点奇怪。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-24 21:37:37 | 显示全部楼层
花莹雨澈 发表于 2018-2-24 21:07
啊。。。就是为什么这个错误的结果会是“0.000000”,而不是别的结果。不好意思,这个问题貌似是有点奇怪 ...

你是问这个代码为什么输出了 0.000000 和 1 吗?

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int num = 3 / 2;
  5.         printf("%f\n", num);
  6.         printf("%d\n", num);
  7.         return 0;
  8. }

  9. 0.000000
  10. 1
  11. 请按任意键继续. . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-24 22:11:36 | 显示全部楼层
人造人 发表于 2018-2-24 21:37
你是问这个代码为什么输出了 0.000000 和 1 吗?

是想问问为什么错误的结果是0.000000,而不是别的数字,比如不是1.000000,也不是乱码什么的,而是输出了0.000000,这是编译器决定的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-24 23:40:46 | 显示全部楼层
因为printf把1以浮点数格式解码了

浮点数存储格式
https://www.cnblogs.com/MikeZhan ... Encode20180117.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-24 23:53:24 | 显示全部楼层
好吧,printf并没有把1以浮点数格式解码

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         int x = 0x42f60000;
  5.         printf("%d\n", x);
  6.         printf("%f\n", x);
  7.         printf("%f\n", *(float *)&x);

  8.         return 0;
  9. }
复制代码


  1.         int x = 0x42f60000;
  2. 00D5424E C7 45 F8 00 00 F6 42 mov         dword ptr [x],42F60000h  
  3.         printf("%d\n", x);
  4. 00D54255 8B 45 F8             mov         eax,dword ptr [x]  
  5. 00D54258 50                   push        eax  
  6. 00D54259 68 98 6B D5 00       push        offset string "%d\n" (0D56B98h)  
  7. 00D5425E E8 0D D1 FF FF       call        _printf (0D51370h)  
  8. 00D54263 83 C4 08             add         esp,8  
  9.         printf("%f\n", x);
  10. 00D54266 8B 45 F8             mov         eax,dword ptr [x]  
  11. 00D54269 50                   push        eax  
  12. 00D5426A 68 30 6B D5 00       push        offset string "%f\n" (0D56B30h)  
  13. 00D5426F E8 FC D0 FF FF       call        _printf (0D51370h)  
  14. 00D54274 83 C4 08             add         esp,8  
  15.         printf("%f\n", *(float *)&x);
  16. 00D54277 F3 0F 5A 45 F8       cvtss2sd    xmm0,dword ptr [x]  
  17. 00D5427C 83 EC 08             sub         esp,8  
  18. 00D5427F F2 0F 11 04 24       movsd       mmword ptr [esp],xmm0  
  19. 00D54284 68 30 6B D5 00       push        offset string "%f\n" (0D56B30h)  
  20. 00D54289 E8 E2 D0 FF FF       call        _printf (0D51370h)  
  21. 00D5428E 83 C4 0C             add         esp,0Ch  
复制代码


至于为什么输出 0.000000
这和printf内部的实现有关
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-3-16 11:01:49 | 显示全部楼层
人造人 发表于 2018-2-24 23:53
好吧,printf并没有把1以浮点数格式解码

好的好的,最近没上论坛回复晚了。非常感谢,解释得很清楚,虽然看不懂汇编(上面应该是汇编语言吧),但是明白是为什么了,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 23:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表