我变秃了。 发表于 2020-7-27 06:56:44

关于int和float互相转换的问题

本帖最后由 我变秃了。 于 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,是为什么?




# include <stdio.h>

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

        printf("%d", i);

        return 0;
}

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


还有下边两张图,是为啥呢?

livcui 发表于 2020-7-27 07:39:03

本帖最后由 livcui 于 2020-7-27 07:41 编辑

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



sunrise085 发表于 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

Cool_Breeze 发表于 2020-7-27 11:31:35

printf函数%d对应整数,%f对应浮点数。printf函数是不会主动转换的!转换是程序员的工作!(一一对应,C语言是非常严谨的!)

风过无痕1989 发表于 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

我变秃了。 发表于 2020-7-28 00:27:28

风过无痕1989 发表于 2020-7-27 17:42
我用 VC++6.0 和 DEV_C++

      printf("%d", i);


我之前用VC++6.0也一样能正常输出,刚换到2013,不知道为啥有点不习惯
页: [1]
查看完整版本: 关于int和float互相转换的问题