为什么输出不同?

fthislife 2009-12-26 10:24:58
下边的程序什么输出的是9.000000 0.000000而不是9.000000 9.000000?
为什么会有差别?是什么原因引起的?
#include<stdio.h>
void main()
{
int c=9;
float a,*p;
a=(float)c;
p=(float*)(&c);
printf("%f %f\n",a,*p);
}
...全文
145 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wj198895 2009-12-26
  • 打赏
  • 举报
回复
p=(float*)(&c);
地址是一个整型的值
不能将其转化成其它类型
selooloo 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 fthislife 的回复:]

指数位为什么是-127?
怎样算出来的?
[/Quote]

去查下float存储,或者看看5L,float类型指数的起始数为127(二进制0111 1111)
十进制换成2进制,指数位要加127,反过来,二进制换成10进制指数为减127
这里的指数位是0,0-127,指数位就是-127了
hujiao199 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hlyces 的回复:]
引用楼主 fthislife 的回复:
下边的程序什么输出的是9.000000 0.000000而不是9.000000 9.000000?
为什么会有差别?是什么原因引起的?
#include <stdio.h>
void main()
{
int c=9;
float a,*p;
    a=(float)c;
p=(float*)(&c);
printf("%f %f\n",a,*p);
}


===========================
你自己不是知道了么。p=(float *)(&(float)c)

[/Quote]
p=(float *)(&(float)c)

这么写错误的。
flyyyri 2009-12-26
  • 打赏
  • 举报
回复
存取的差异
fthislife 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyu637 的回复:]
C/C++的浮点数据类型有float和double两种。
类型float大小为4字节,即32位,内存中的存储方式如下:


符号位(1 bit) 
指数(8 bit) 
尾数(23 bit) 


类型double大小为8字节,即64位,内存布局如下:


符号位(1 bit) 
指数(11 bit) 
尾数(52 bit) 


 
符号位决定浮点数的正负,0正1负。
指数和尾数均从浮点数的二进制科学计数形式中获取。
如,十进制浮点数2.5的二进制形式为10.1,转换为科学计数法形式为(1.01)*(10^1),由此可知指数为1,尾数(即科学计数法的小数部分)为01。
根据浮点数的存储标准(IEEE制定),float类型指数的起始数为127(二进制0111 1111),double类型指数的起始数为1023(二进制011 1111 1111),在此基础上加指数,得到的就是内存中指数的表示形式。尾数则直接填入,如果空间多余则以0补齐,如果空间不够则0舍1入。所以float和double类型分别表示的2.5如下(二进制):


符号位 
指数 
尾数 


1000 0000 
010 0000 0000 0000 0000 0000 


100 0000 0000 
0100 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 


浮点数2.5可以用二进制小数准确表示(2.5=1*(2^1)+0*(2^0)+1*(2^-1)),但很多小数不可以准确表示
文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppsl/2008629/129103.html)
[/Quote]

谢谢楼上的讲解,我也知道浮点型在内存的储存方式,但是不知道
a=(float)c; 这句的转换过程是怎样的?
p=(float*)(&c); 还有这句,是不是系统读取指针所指的内容,是安照指针的类型读取而不是安照指针所指的类型读取,是吗?
z569362161 2009-12-26
  • 打赏
  • 举报
回复
整数和浮点数存储的差异.
wuyu637 2009-12-26
  • 打赏
  • 举报
回复
C/C++的浮点数据类型有float和double两种。
类型float大小为4字节,即32位,内存中的存储方式如下:


符号位(1 bit)
指数(8 bit)
尾数(23 bit)



类型double大小为8字节,即64位,内存布局如下:


符号位(1 bit)
指数(11 bit)
尾数(52 bit)




符号位决定浮点数的正负,0正1负。
指数和尾数均从浮点数的二进制科学计数形式中获取。
如,十进制浮点数2.5的二进制形式为10.1,转换为科学计数法形式为(1.01)*(10^1),由此可知指数为1,尾数(即科学计数法的小数部分)为01。
根据浮点数的存储标准(IEEE制定),float类型指数的起始数为127(二进制0111 1111),double类型指数的起始数为1023(二进制011 1111 1111),在此基础上加指数,得到的就是内存中指数的表示形式。尾数则直接填入,如果空间多余则以0补齐,如果空间不够则0舍1入。所以float和double类型分别表示的2.5如下(二进制):


符号位
指数
尾数

0
1000 0000
010 0000 0000 0000 0000 0000

0
100 0000 0000
0100 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000



浮点数2.5可以用二进制小数准确表示(2.5=1*(2^1)+0*(2^0)+1*(2^-1)),但很多小数不可以准确表示
文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppsl/2008629/129103.html)
huang_gen 2009-12-26
  • 打赏
  • 举报
回复
同意楼上的说法:
确实在内存中,int float的存储形式不同,int采取的事补码形式,float采取的是“指数形式”,如果你感兴趣,可以把float的内存信息用十六进制的形式输出进行研究,当把指数形式的二进制位信息按照int的补码进行解析的时候,往往结果不是我们期待的!
fthislife 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 stardust20 的回复:]
flaot和int在内存中的存取方式不同(具体没研究过)。。。然后你以float的形式去取int型的数据,和以float的形式去取float型的数据,虽然可能要取的数据大小相等,但是它们的存储方式不同,所以结果不同
[/Quote]

哪int强制转成float时的详细过程是怎样的?在内存中是进行怎样的运算的?
hlyces 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 fthislife 的回复:]
下边的程序什么输出的是9.000000 0.000000而不是9.000000 9.000000?
为什么会有差别?是什么原因引起的?
#include <stdio.h>
void main()
{
int c=9;
float a,*p;
    a=(float)c;
p=(float*)(&c);
printf("%f %f\n",a,*p);
}
[/Quote]

===========================
你自己不是知道了么。p=(float *)(&(float)c)
stardust20 2009-12-26
  • 打赏
  • 举报
回复
flaot和int在内存中的存取方式不同(具体没研究过)。。。然后你以float的形式去取int型的数据,和以float的形式去取float型的数据,虽然可能要取的数据大小相等,但是它们的存储方式不同,所以结果不同
东大坡居士 2009-12-26
  • 打赏
  • 举报
回复
学习~~
fthislife 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 selooloo 的回复:]
a=(float)c; 是值转换,和计算机的自动类型转换一样的,也就是和a=c; 效果一样,这时计算机帮你完成转换
p=(float*)(&c);是将c的内存形式解释为浮点型,c的值是9,在内存中为 0x0009,二进制为
00000000 00000000 00000000 00001001
将其解释为浮点数就为
0 00000000 0000000 00000000 00001001
符号位 是0
指数 位是00000000
尾数  是0000000 00000000 00001001
根据浮点数的计算规则,*p的值就是1.00000000000000000001001*2-127
指数位是-127,是个很小的数 约等于0,由于浮点数的精度问题,打印结果就为0了


[/Quote]

指数位为什么是-127?
怎样算出来的?
coffeesen 2009-12-26
  • 打赏
  • 举报
回复
楼上回答是
含光剑 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 selooloo 的回复:]
a=(float)c; 是值转换,和计算机的自动类型转换一样的,也就是和a=c; 效果一样,这时计算机帮你完成转换
p=(float*)(&c);是将c的内存形式解释为浮点型,c的值是9,在内存中为 0x0009,二进制为
00000000 00000000 00000000 00001001
将其解释为浮点数就为
0 00000000 0000000 00000000 00001001
符号位 是0
指数 位是00000000
尾数  是0000000 00000000 00001001
根据浮点数的计算规则,*p的值就是1.00000000000000000001001*2-127
指数位是-127,是个很小的数 约等于0,由于浮点数的精度问题,打印结果就为0了
[/Quote]

强人。。仰慕下,指针好像必须要初始化,这样用很不安全。
wangxipu 2009-12-26
  • 打赏
  • 举报
回复
好基础的知识啊
selooloo 2009-12-26
  • 打赏
  • 举报
回复
a=(float)c; 是值转换,和计算机的自动类型转换一样的,也就是和a=c; 效果一样,这时计算机帮你完成转换
p=(float*)(&c);是将c的内存形式解释为浮点型,c的值是9,在内存中为 0x0009,二进制为
00000000 00000000 00000000 00001001
将其解释为浮点数就为
0 00000000 0000000 00000000 00001001
符号位 是0
指数 位是00000000
尾数 是0000000 00000000 00001001
根据浮点数的计算规则,*p的值就是1.00000000000000000001001*2-127
指数位是-127,是个很小的数 约等于0,由于浮点数的精度问题,打印结果就为0了

69,337

社区成员

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

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