社区
C语言
帖子详情
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为什么却是对的呢。
...全文
744
7
打赏
收藏
long和float类型转换问题
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为什么却是对的呢。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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
打赏
举报
回复
期待高手的回答
java中,8个字节的
long
为什么可以自动转换为4个字节的
float
Java 对
类型转换
的设计理念:在不损失数值量级的情况下,允许从较窄的
类型转换
到较宽的类型,即使可能会有一些精度的损失。
JAVA Char类型强制转换情况&int、
long
转
float
、double的精度丢失
问题
本文主要探讨JAVA数据
类型转换
情况。JAVA自动
类型转换
int
long
转
float
、double精度丢失情况探讨&JAVA强制
类型转换
char转short byte的情况探讨
关于Java变量的
类型转换
和提升
Java 是一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验.在Java中,当参与运算数据类型不一致时,就会进行
类型转换
。和。自动
类型转换
即:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数 据范围大的时会自动进行。// 整型默认情况下是int// 浮点型默认情况下是doubleb = a;// a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为
long
类型,然后赋值a = b;
Java
类型转换
在Java中,当参与运算数据类型不一致时,就会进行
类型转换
。强制
类型转换
:当进行操作的时候,代码需要经过一定的格式处理,不能自动完成。特点:数据范围大的到数据范围小的。Java作为一个强类型编程语言,当不同类型之间的变量相互赋值的时候,会有较严格的校验。不同数字类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型。将一个字面值常量进行赋值的时候,Java会自动针对数字范围进行检查。如果需要把范围大的类型赋值给范围小的,需要强制
类型转换
,但是。强制
类型转换
不一定能成功,不相干的类型不能相互转换。
long
int double
float
参考:https://blog.csdn.net/ideality_hunter/article/details/78432486
long
是长整型,64位 int是短整型,32位 double是双精度浮点型
float
是单精度浮点型
Long
long
/ int -->
long
long
转double,可能会越界
long
转double...
C语言
70,040
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章