long和float类型转换问题

ruijun12 2009-09-18 08:53:30
float f1 = (float)LONG_MAX;
long l1 = (long)f1;

long l2 = (long)((float)LONG_MAX);

得到的结果是:f1: 2147483648.000000, l1: -2147483648, l2: 2147483647
f1的值不对应该是在类型转换过程中的精度丢失造成的,问题是为什么同样是先转float再转long,l2为什么却是对的呢。
...全文
660 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LightInDark_pan 2009-09-18
  • 打赏
  • 举报
回复
只是显示变了而已,但是具体在内存中的值是一样的,只不过float有个专门的算法而已。
w0911h 2009-09-18
  • 打赏
  • 举报
回复
float是4字节,存储底数的位数只有23位,应该是不能表示10位有效数字的,但是你的第一种转换竟然能得达那么接近的值,很奇怪
brookmill 2009-09-18
  • 打赏
  • 举报
回复
刚才看了看gcc产生的汇编代码,类型转换的地方眼花缭乱,没看懂。
但是我感觉对于f1和l1,编译器是真刀真枪地转换了一番。
而对于l2,编译器作弊了,直接把2147483647赋值给了l2
brookmill 2009-09-18
  • 打赏
  • 举报
回复
有意思。编译器会不会对l2的转换作了优化?
wanghao111 2009-09-18
  • 打赏
  • 举报
回复
这个具体还要看编译器,不同的编译器中各个类型所占的空间也是不差别的。
james_hw 2009-09-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 brookmill 的回复:]
刚才看了看gcc产生的汇编代码,类型转换的地方眼花缭乱,没看懂。
但是我感觉对于f1和l1,编译器是真刀真枪地转换了一番。
而对于l2,编译器作弊了,直接把2147483647赋值给了l2

[/Quote]

感觉有可能是这样
fx397993401 2009-09-18
  • 打赏
  • 举报
回复
期待高手的回答

70,020

社区成员

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

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