鱼C论坛

 找回密码
 立即注册
查看: 2613|回复: 2

实型变量问题

[复制链接]
发表于 2016-6-16 08:05:42 | 显示全部楼层 |阅读模式

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

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

x
在《小甲鱼零基础入门学习C语言》中“第二章 数据类型,运算符和表达式”PPT第24页有如下补码问题:
经试验仿真后结果为:
(1)1.000000
(2)0.000000
(3)0.000000
有大神能解释一下为什么吗?特别是(2)小题答案不能理解,我觉得也应该为1.000000
QQ截图20160616075836.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-17 00:21:00 | 显示全部楼层
夜雨de街灯 发表于 2016-6-16 11:23
我调试过,单独把3/2拿出来
a=3/2;
printf("%f\n",a);

谢谢你耐心的解答,大致明白了,细节那我再想想。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 23:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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