| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2102 人关注过本帖, 1 人收藏
标题:来点有意思的---代码很简单,看谁不用编译器一眼得出正确结果
只看楼主 加入收藏
user_qiangzi
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:137
专家分:194
注 册:2011-8-29
收藏
得分:0 
5.000000
5.010000
2012-04-25 20:57
章鱼。
Rank: 2
等 级:论坛游民
帖 子:9
专家分:12
注 册:2012-3-6
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

  这是虾米情况。
2012-04-26 14:12
lxsjzbd
Rank: 4
来 自:河北省
等 级:业余侠客
帖 子:97
专家分:258
注 册:2012-3-31
收藏
得分:0 
printf不会进行格式转换
2012-04-26 15:07
S_Ringo
Rank: 4
来 自:歌舞伎町
等 级:业余侠客
帖 子:94
专家分:230
注 册:2012-4-15
收藏
得分:0 
参考资料:
1、http://www.
2、《狂人C—程序员入门必备》(键盘农夫【著】)
对于5.01的double型存储,先转换成二进制指数形式,0101.……(这里是0.01的二进制)=1.01……(这里是0.01的二进制)(我懒了,没写上去)x2²,因此指数部分是2
至于52位尾数,可以利用乘2取整,这个不做过多说明
第一位是符号位,也不多说明
对于指数,double型和float型有区别,float型,8位指数位,要加127,对于double型,11位指数位,要加1023,才是最后存储的值
所以
5.01,指数为2,即 000 0000 0010,加上1023(011 1111 1111)得出100 0000 0001,因此29楼正解……

至于验算,在参考资料2的书中,介绍了一种利用共用体查看的方法,
代码如下:
#include<stdio.h>
int main()
{
    void output(unsigned char[],int);
    union double_char
        {
            double d;
            unsigned char byte[8];
        }u;
    u.d=5.01;
    output(u.byte,sizeof(u.byte)/sizeof(u.byte[0]));
    return(0);
}
void output(unsigned char byte[],int n)
{
    int i;
    for(i=0;i<n;i++)
    {
        printf("%02X ",byte[i]);
    }
    printf("\n");
}
要说明的是,计算机输出是从右向左方向输出,因此输出的8个两位十六进制数要翻转一下顺序,才是实际的存储方式的体现
如本例中,输出
0A D7 A3 70 3D 0A 14 40
实际是40 14 0A 3D 70 A3 D7 0A
因此是01000000 00010100 00001010 00111101 01110000 10100011 11010111 00001010

[ 本帖最后由 S_Ringo 于 2012-4-26 15:45 编辑 ]
2012-04-26 15:21
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
乍看之下,直觉就是要涉及到浮点数的存储方式了。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2012-04-26 19:09
lyxhkg
Rank: 2
等 级:禁止访问
帖 子:50
专家分:24
注 册:2012-4-24
收藏
得分:0 
你的%F跟5 没有任何意识的赋值%F是一个双精度符号 你的%d 5.01精度是错的 %d不可能存在小数点如果%F跟%d交换有可能输出正确编码从而代码成立!输出固定数值!
结论
程序代码:
# include <stdio.h>
int main ()
{ printf ("%f\n",5); //
  printf ("%d\n",5.01);
}
结论 %f输出值为 0.000000
     %d输出值为 1889786510
如果当%f跟%d互换输出什么数值
2012-05-25 14:04
twt141664
Rank: 1
等 级:新手上路
帖 子:5
专家分:8
注 册:2012-5-26
收藏
得分:0 
我勒个去!!
2012-05-26 22:31
快速回复:来点有意思的---代码很简单,看谁不用编译器一眼得出正确结果
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033292 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved