关于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:41 编辑
上面三张 i 是 float 类型的数,不能用%d输出的,
printf("%n", i); //不行
printf("%f", i);
下面一张的 i 是 int 类型的数,也不能用 %f输出
看看我这个帖子吧。能帮你解惑。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
printf函数%d对应整数,%f对应浮点数。printf函数是不会主动转换的!转换是程序员的工作!(一一对应,C语言是非常严谨的!) 我用 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
风过无痕1989 发表于 2020-7-27 17:42
我用 VC++6.0 和 DEV_C++
printf("%d", i);
我之前用VC++6.0也一样能正常输出,刚换到2013,不知道为啥有点不习惯
页:
[1]