免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2205 | 回复: 2
打印 上一主题 下一主题

请教 浮点数值的内存结构 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-21 21:57 |只看该作者 |倒序浏览
void main()
{
        float f = 12345.0;
   
        printf("%o  %x  %f  %d  %d\n", f, f, f, (int &)f);

       
}

结果是:
0  40c81c80  12345.000000  0  1086856320

搞不懂为什么 %o的输出是0, 还有 和下面讲的16进制结果也不一样。是下面说的有问题,还是其他的什么原因??


zz:

现在让我们按照IEEE浮点数表示法,一步步的将float型浮点数12345.0f转换为十六进制代码。在处理这种不带小数的浮点数时,直接将整数部转化为二进制表示:1 11100010 01000000也可以这样表示:11110001001000000.0然后将小数点向左移,一直移到离最高位只有1位,就是最高位的1:1.11100010010000000一共移动了16位,在布耳运算中小数点每向左移一位就等于在以2为底的科学计算法表示中指数+1,所以原数就等于这样:1.11100010010000000 * ( 2 ^ 16 )好了,现在我们要的尾数和指数都出来了。显而易见,最高位永远是1,因为你不可能把买了16个鸡蛋说成是买了0016个鸡蛋吧?(呵呵,可别拿你买的臭鸡蛋甩我~),所以这个1我们还有必要保留他吗?(众:没有!)好的,我们删掉他。这样尾数的二进制就变成了:11100010010000000最后在尾数的后面补0,一直到补够23位:11100010010000000000000(MD,这些个0差点没把我数的背过气去~)


再回来看指数,一共8位,可以表示范围是0 - 255的无符号整数,也可以表示-128 - 127的有符号整数。但因为指数是可以为负的,所以为了统一把十进制的整数化为二进制时,都先加上127,在这里,我们的16加上127后就变成了143,二进制表示为:10001111
12345.0f这个数是正的,所以符号位是0,那么我们按照前面讲的格式把它拼起来:
0 10001111 11100010010000000000000
01000111 11110001 00100000 00000000
再转化为16进制为:47 F1 20 00,最后把它翻过来,就成了:00 20 F1 47。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-03-21 22:41 |只看该作者
有空看看这个文档吧。

剖析Intel IA32架构下C语言及CPU浮点数机制.pdf

175.9 KB, 下载次数: 168

论坛徽章:
0
3 [报告]
发表于 2006-03-22 01:56 |只看该作者
In printf, you have five specifiers for outputs, but you only give four variables. Therefore the output for %o is a random number (in your case it is 0).
Please find the following example which is compiled with gcc.

#include <stdio.h>

int main()
{
  float f=123456.0;
  int *ip=(int *)&f;

  printf("size of int = %d (bytes)\n", sizeof(int));
  printf("%o    %x    %f    %d \n", *ip,*ip,f,(int)f);
  return 0;
}

The result is:
size of int = 4 (bytes)
10774220000    47f12000    123456.000000    123456
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP