社区
C语言
帖子详情
为什么输出不同?
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);
}
...全文
152
17
打赏
收藏
为什么输出不同?
下边的程序什么输出的是9.000000 0.000000而不是9.000000 9.000000? 为什么会有差别?是什么原因引起的? #include void main() { int c=9; float a,*p; a=(float)c; p=(float*)(&c); printf("%f %f\n",a,*p); }
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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如下(二进制):
符号位
指数
尾数
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)
[/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了
你必须知道的495个C语言问题
2.23 枚举和一组预处理的#define有什么
不同
? 2.24 枚举可移植吗? 2.25 有什么显示枚举值符号的容易方法吗? 位域 2.26 一些结构声明中的这些冒号和数字是什么意思? 2.27 为什么人们那么喜欢用显式的...
100家大公司java笔试题汇总
4. 下面代码的
输出
是什么? class Super {public Integer getLenght() { return new Integer(4); }} public class Sub extends Super {public Long getLenght() { return new Long(5); }} 答:A. 4,4 5. 在Java中,...
PHP程序设计简明教程
- **MySQL软件的安装和服务的启动**:安装MySQL数据库管理系统,并启动MySQL服务,为后续开发提供数据存储支持。 #### 四、Web客户端技术 ##### 1. 浏览器工作原理 浏览器是用户与Web应用交互的主要界面。当用户...
xgboost相比传统gbdt有何
不同
?xgboost为什么快?xgboost如何支持并行?
我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。...
什么是Vue.js的计算属性(computed properties)?与方法(methods)有什么
不同
?
什么是Vue.js的计算属性(computed properties)?与方法(methods)有什么
不同
?
C语言
70,026
社区成员
243,262
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章