鱼C论坛

 找回密码
 立即注册
查看: 1203|回复: 5

[已解决]关于int和float互相转换的问题

[复制链接]
发表于 2020-7-27 06:56:44 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 我变秃了。 于 2020-7-27 07:04 编辑

# include <stdio.h>

int main(void)
{
        float i = 4.1f;
        i = (int)(i + 0.9);
        printf("%d", i);

        return 0;
}

用VS2013输出结果为0,是为什么?
微信图片_20200727065217.png



# include <stdio.h>

int main(void)
{
        float i = 4.1f;

        printf("%d", i);

        return 0;
}

用VS2013输出结果为1610612736,又是为什么?
2.png

还有下边两张图,是为啥呢?
4.png
5.png
最佳答案
2020-7-27 09:10:06
看看我这个帖子吧。能帮你解惑。C语言中浮点数存储与%f输出细节探究
下面是我从帖子中摘抄的一部分
计算机中浮点数是以IEEE754的格式存放
一个32位的浮点数,其最高位是符号位,然后有8位是阶码,最后有23位尾数
一个64位的浮点数,其最高位是符号位,然后有11位是阶码,最后有52位尾数
符号位不必说,0表示正,1表示负
浮点数的存放,先将浮点数转为1.n*2^m这种形式,其中m为阶码数,n为尾数
下面我们看一下3.141600的32位存储(为啥选3.1416?最近看到的那个帖子用的就是这个数,回答完他之后,我也没再换其他的数)
最高位符号位为0
3.141600=1.5708*2^1
阶码数是1,尾数是0.5708
阶码数转为阶码是1+127=128  二进制为1000 0000
尾数0.5708转成23位尾数是  100 1001 0000 1111 1111 1001
尾数转二进制的方法很简单,不断的乘2,,每乘一次2 ,就写一位,乘的结果没超过1就写0,超过1,就写1并减去1,一直乘到够自己用,或者没有小数为止

这里我们就得到了3.1416存储的这32位数 0100 0000 0100 1001 0000 1111 1111 1001
十进制就是   1078530041   ,十六进制就是0X40490FF9


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

使用道具 举报

发表于 2020-7-27 07:39:03 | 显示全部楼层
本帖最后由 livcui 于 2020-7-27 07:41 编辑

上面三张 i 是 float 类型的数,不能用%d输出的,
printf("%n", i);    //不行
printf("%f", i);
下面一张的 i 是 int 类型的数,也不能用 %f输出



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

使用道具 举报

发表于 2020-7-27 09:10:06 | 显示全部楼层    本楼为最佳答案   
看看我这个帖子吧。能帮你解惑。C语言中浮点数存储与%f输出细节探究
下面是我从帖子中摘抄的一部分
计算机中浮点数是以IEEE754的格式存放
一个32位的浮点数,其最高位是符号位,然后有8位是阶码,最后有23位尾数
一个64位的浮点数,其最高位是符号位,然后有11位是阶码,最后有52位尾数
符号位不必说,0表示正,1表示负
浮点数的存放,先将浮点数转为1.n*2^m这种形式,其中m为阶码数,n为尾数
下面我们看一下3.141600的32位存储(为啥选3.1416?最近看到的那个帖子用的就是这个数,回答完他之后,我也没再换其他的数)
最高位符号位为0
3.141600=1.5708*2^1
阶码数是1,尾数是0.5708
阶码数转为阶码是1+127=128  二进制为1000 0000
尾数0.5708转成23位尾数是  100 1001 0000 1111 1111 1001
尾数转二进制的方法很简单,不断的乘2,,每乘一次2 ,就写一位,乘的结果没超过1就写0,超过1,就写1并减去1,一直乘到够自己用,或者没有小数为止

这里我们就得到了3.1416存储的这32位数 0100 0000 0100 1001 0000 1111 1111 1001
十进制就是   1078530041   ,十六进制就是0X40490FF9


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

使用道具 举报

发表于 2020-7-27 11:31:35 | 显示全部楼层
printf函数%d对应整数,%f对应浮点数。printf函数是不会主动转换的!转换是程序员的工作!(一一对应,C语言是非常严谨的!)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-27 17:42:46 | 显示全部楼层
我用 VC++6.0 和 DEV_C++

        printf("%d", i);
                printf("\n");

                printf("%ld",i);
                printf("\n");

                printf("%f",i);
                printf("\n");

                printf("%lf",i);
                printf("\n");

前面两输出都是 :1610612736
后面两输出都是 :4.100000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 00:27:28 | 显示全部楼层
风过无痕1989 发表于 2020-7-27 17:42
我用 VC++6.0 和 DEV_C++

        printf("%d", i);

我之前用VC++6.0也一样能正常输出,刚换到2013,不知道为啥有点不习惯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 10:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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