pirntf中的类型转换问题

lklll 2006-04-02 12:13:46
printf中是否有强制转换呢?

如:

printf("%d",999.0);

输出为0

printf("%d",(int)999.0);

输出为999.

为什么第一种格式无法正确输出呢?
...全文
167 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lklll 2006-04-02
  • 打赏
  • 举报
回复
既然没有转换,那么为什么输出会为0 呢?
Wolf0403 2006-04-02
  • 打赏
  • 举报
回复
sizeof(float) == sizeof(int) == 4 (IA32)
关键问题是,这样的效果基本属于

float f = 999.0;
printf( "%d", *(int *)(&f) );
postren 2006-04-02
  • 打赏
  • 举报
回复
printf 中没有自动转换类型,如果需要则手工强制转换
goodluckyxl 2006-04-02
  • 打赏
  • 举报
回复
是double存储8个字节 1符号有些还是保持7位指数有些13位 其他的是尾数
你随便拿个double 的数据进行memcpy 进int看看就知道了
999.0的内存分布 : 00 00 00 00 00 38 8F 40 拷贝4个字节就是0
yinenlai 2006-04-02
  • 打赏
  • 举报
回复
haha 究竟是怎么截取的
难道是float前四个字节是存储整数部分 后四个字节是存储小数部分???
Thanks
goodluckyxl 2006-04-02
  • 打赏
  • 举报
回复
K&R C
goodluckyxl 2006-04-02
  • 打赏
  • 举报
回复
楼上说的基本符合情况
float 在变参传入时按照K&C会以double 类型进行存储8个字节
int取的是4个字节 截取的数据是为0所以会有这个问题
OpenHero 2006-04-02
  • 打赏
  • 举报
回复
%d截取只截取了float的一部分,哪一部分正好全为0
变参数的函数,按照前面的规定从内存中取得参数的大小,给的数是float的,但是你告诉编译器,需要截取的那一部分是int的,所以:) ~~~按照int的规则来截取float,看看内存布局就知道为什么为0了
cracker234 2006-04-02
  • 打赏
  • 举报
回复
因为强制转换是某种意义上是一种压缩,sizeof(FLOAT)>sizeof(int) ; %d截取FLOAT一部分。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧