f904399233 发表于 2016-6-16 08:05:42

实型变量问题

在《小甲鱼零基础入门学习C语言》中“第二章 数据类型,运算符和表达式”PPT第24页有如下补码问题:
经试验仿真后结果为:
(1)1.000000
(2)0.000000
(3)0.000000
有大神能解释一下为什么吗?特别是(2)小题答案不能理解,我觉得也应该为1.000000

夜雨de街灯 发表于 2016-6-16 11:23:18

我调试过,单独把3/2拿出来
a=3/2;
printf("%f\n",a);
就会等于1;
printf("%f\n",3/2);
就会等于0;

我也不太清楚不过我给你百度得到的结果:

这是因为3/2是一个整型数常量表达式,整型数常量表达式有编译器计算机运行的结果,3/2的商是1。这是编译器计算出来的3/2这个常量表达式的值,但是printf()要输出格式为%f,即输出一个单精度浮点数。在C语言中浮点数使用的是IEEE754编码,也就是说一个32位的int类型的数1,使用IEEE754编码所表示的数值是多少的问题。可以编写如下代码:
#include <stdio.h>
int main()
{
int i = 1;
float f = *(float *) &i;
printf("%f\n", f);
return 0;
}
运行结果与问题中的 printf("%f\n", 2/3)是一样的,都为0。

要获得正确的结果,应该对整型常量表达式进行强制类型转换:
printf("%f\n", (float)(3/2));

f904399233 发表于 2016-6-17 00:21:00

夜雨de街灯 发表于 2016-6-16 11:23
我调试过,单独把3/2拿出来
a=3/2;
printf("%f\n",a);


谢谢你耐心的解答,大致明白了,细节那我再想想。
页: [1]
查看完整版本: 实型变量问题