一个关于浮点数的存储问题.

th362cn 2005-03-18 03:05:07
我最近学习c语言.书上说浮点数在内存中的顺序是:

符号位 隐藏的小数点 小数 指数

这样的排列顺序.想请教各位高手.
就TC2.0而言,float型和double型的"小数位"和"指数位"各是多少位二进制?
为何float型浮点数有效数字只有7位?
...全文
131 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
th362cn 2005-03-18
  • 打赏
  • 举报
回复
谢谢了.
寻开心 2005-03-18
  • 打赏
  • 举报
回复
关于32位浮点数的结构,你可以看我的btlog当中的描述部分
http://btlog.csdn.net/happy_888
根据IEEE的标准,浮点数的定义如下
符号位 指数位 小数部分 指数偏移量
单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127
双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023
我们以单精度浮点数来说明:
符号位,表述浮点数的正或者负
指数实际也有正负的,但是没有单独的符号位,而是采用了一个偏移来表示
在计算机的世界里,进位都是二进制的,指数表示的也是2的N次幂
这个数据格式当中的,指数是8位,可表达的范围是0到255
而对应的实际的指数是-127到+128
这里特殊说明,-127和+128这两个数据在IEEE当中是保留的用作多种用途的
-127表示的数字是0
128和其他位数组合表示多种意义,最典型的就是NAN状态

小数部分,并不是一个浮点数的实际的小数
实际的小数在这个小数前面还保留了一个1
拿浮点数1.0来说
符号位是0, 实际指数是0,对应这里的指数就是127了,也就是0x7f
而小数部分就是1.0了, 1是暗含的不存储,实际的小数部分就是0了
因此组合起来的数据就是,0x3f80000

16位的也是类似的,自己分析一下
WORD w = *((WORD*)(&f))
是把一个浮点数按照内存结构转化成为一个unsigned int 16位的结构
TC 2.0不是C++ ,是c++的话就可以简单 w = (int&) f; 就可以了
th362cn 2005-03-18
  • 打赏
  • 举报
回复
我没领会你的意思.WORD 和DWORD 引导的是何物?如何使用?
寻开心 2005-03-18
  • 打赏
  • 举报
回复
无论在什么系统上,对于一个数据类型来说,使用c语言的sizeof函数都可以知道它的大小是2个字节还是4个字节

对于16位的系统,tc2.0来说, float 是16位, double是32位的
根据ieee的浮点数标准是可以精确的知道组成float或者double的各个位的情况的
无论你是出于什么目的来研究这个结构,都可以用下面的方法获得它的各个位的状况

float f;
double d;
WORD w = * ((WORD * )( &f))
DWORD dw = * ((DWORD * )( &f))

70,021

社区成员

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

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