类型转换问题

flysnowhite 2010-11-17 12:26:10
假设int i=1;
float f=(float)i;
请问f是多少?还是i内存中的值0x00000001(对其按单精度格式进行重新解释)吗?
...全文
172 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
whonee 2010-11-17
  • 打赏
  • 举报
回复
存储方式变化了,原本的位数也进行了扩展!
無_1024 2010-11-17
  • 打赏
  • 举报
回复
f = 1.000000精度变了 以及他的存贮方式变了
wasx1 2010-11-17
  • 打赏
  • 举报
回复
1.000000
野男孩 2010-11-17
  • 打赏
  • 举报
回复
还是1

int i=1;
float f=(float)i;
float *pf = (float*)&i;

要注意的是*pf这种转换
liutengfeigo 2010-11-17
  • 打赏
  • 举报
回复
在内存中就不是你那样存了,按照浮点数的标准形式存了
lsupper 2010-11-17
  • 打赏
  • 举报
回复
还是1,只不过计算的精度不一样了.....
Metrosexual 2010-11-17
  • 打赏
  • 举报
回复
大家都说的很清楚了,我就不说了!
jznhljg 2010-11-17
  • 打赏
  • 举报
回复
(gdb) l
warning: Source file is more recent than executable.
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int i = 1;
6 float f = (float)i;
7 printf("%f\n", f);
8 return 0;
9 }
(gdb) b 7
Breakpoint 1 at 0x100000f0c: file test.c, line 7.
(gdb) r
Starting program: /Users/lee/MyProgram/test/test
Reading symbols for shared libraries +. done

Breakpoint 1, main (argc=1, argv=0x7fff5fbff9d0) at test.c:7
7 printf("%f\n", f);
(gdb) x/xw &i
0x7fff5fbff9ac: 0x00000001
(gdb) x/xw &f
0x7fff5fbff9a8: 0x3f800000
(gdb) x/tw &i
0x7fff5fbff9ac: 00000000000000000000000000000001
(gdb) x/tw &f
0x7fff5fbff9a8: 00111111100000000000000000000000
(gdb) c
Continuing.
1.000000

Program exited normally.
jznhljg 2010-11-17
  • 打赏
  • 举报
回复

(gdb) l
warning: Source file is more recent than executable.
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int i = 1;
6 float f = (float)i;
7 printf("%f\n", f);
8 return 0;
9 }
(gdb) b 7
Breakpoint 1 at 0x100000f0c: file test.c, line 7.
(gdb) r
Starting program: /Users/lee/MyProgram/test/test
Reading symbols for shared libraries +. done

Breakpoint 1, main (argc=1, argv=0x7fff5fbff9d0) at test.c:7
7 printf("%f\n", f);
(gdb) x/xw &i
0x7fff5fbff9ac: 0x00000001
(gdb) x/xw &f
0x7fff5fbff9a8: 0x3f800000
(gdb) x/tw &i
0x7fff5fbff9ac: 00000000000000000000000000000001
(gdb) x/tw &f
0x7fff5fbff9a8: 00111111100000000000000000000000
(gdb) c
Continuing.
1.000000

Program exited normally.
赵4老师 2010-11-17
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
luciferisnotsatan 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dubiousway 的回复:]

引用楼主 snowwhite1 的回复:
假设int i=1;
float f=(float)i;
请问f是多少?还是i内存中的值0x00000001(对其按单精度格式进行重新解释)吗?


不是了,浮点数有自己的格式,1符号8阶码23尾数,并且阶码是指数+偏移127, 尾数高位1也不计入
所以内存里表示的样子完全不同

从高到低位,应该是这样
0 0111 1111 000……
[/Quote]
正解
zhutianjin4355255 2010-11-17
  • 打赏
  • 举报
回复
1.000000
dubiousway 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 snowwhite1 的回复:]
假设int i=1;
float f=(float)i;
请问f是多少?还是i内存中的值0x00000001(对其按单精度格式进行重新解释)吗?
[/Quote]

不是了,浮点数有自己的格式,1符号8阶码23尾数,并且阶码是指数+偏移127, 尾数高位1也不计入
所以内存里表示的样子完全不同

从高到低位,应该是这样
0 0111 1111 00000000000000000000000
也就是
3F 80 00 00

在内存一般是 00 00 80 3F .而不是 01 00 00 00 (0x00 00 00 01)
内容概要:本文介绍了COSO企业风险管理框架,阐述了企业风险管理的定义、目标、构成要素及其与内部控制的关系。文章指出,企业风险管理是一个由董事会、管理层及其他人员实施的,应用于战略制定并贯穿于企业之中的过程,旨在识别可能影响主体的潜在事项,管理风险以使其在该主体的风险容量之内,并为主体目标的实现提供合理保证。该框架强调了企业风险管理的八大构成要素:内部环境、目标设定、事项识别、风险评估、风险应对、控制活动、信息与沟通、监控。此外,文章还讨论了企业风险管理的局限性,如人为判断失误、成本与效益的权衡、管理层凌驾等。 适合人群:具备一定管理学基础知识,对风险管理有兴趣的学者、企业管理人员、内部审计师及外部审计师。 使用场景及目标:①帮助组织理解并应用企业风险管理框架,以提高组织的风险管理水平;②指导企业如何通过有效的风险管理来实现其战略、经营、报告和合规目标;③为企业提供一套标准化的风险管理语言,促进内外部沟通与合作。 阅读建议:读者应结合实际案例,深入理解每个构成要素的具体应用,同时关注企业风险管理的局限性,以全面把握企业风险管理的本质。此外,建议定期回顾和更新风险管理策略,以适应不断变化的内外部环境。

70,040

社区成员

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

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