| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1641 人关注过本帖
标题:输出内存中的存储二进制
只看楼主 加入收藏
hc810787576
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-4-26
结帖率:0
收藏
已结贴  问题点数:20 回复次数:10 
输出内存中的存储二进制
输入一个实数(正数负数还有整数浮点型数),输出对应的double型内存中的存储二进制表示,同时输出对应的float型在内存中的存储二进制表示。求指点,我是一名学生,急着教作用
搜索更多相关主题的帖子: double 二进制 
2015-04-26 15:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
纯伸手了吧,不是你说“急”就能让人代劳了。

授人以渔,不授人以鱼。
2015-04-26 21:38
hc810787576
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-4-26
收藏
得分:0 
回复 2楼 TonyDeng
不好意思  我也明白授之于鱼不好。希望你能授之予渔,指点指点我
2015-04-27 21:30
hc810787576
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-4-26
收藏
得分:0 
回复 2楼 TonyDeng
我现在刚刚学到指针的开头,我看的是谭浩强老师的教科书。
2015-04-27 21:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我已外出,明天给你解释一下吧。

授人以渔,不授人以鱼。
2015-04-27 21:40
hc810787576
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2015-4-26
收藏
得分:0 
回复 5楼 TonyDeng
谢谢你,真的不好意思
2015-04-27 21:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
/*
http://bbs.bccn.net/thread-444513-1-1.html
输入一个实数(正数负数还有整数浮点型数),输出对应的double型内存中的存储二进制表示,同时输出对应的float型在内存中的存储二进制表示。
*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    double value;
    unsigned char* p = NULL;
    int index;

    do
    {
        printf_s("Input a double value: ");
        fflush(stdin);
    } while (scanf_s("%lf", &value) != 1);
    printf_s("The value is %f\n", value);
    printf_s("Memory image: ");
    p = (unsigned char*)&value;
    for (index = 0; index < sizeof(value); ++index)
    {
        printf_s("%02X ", *p++);
    }
    putchar('\n');

    printf_s("\nPress any key to continue...");
    fflush(stdin);
    getchar();
    return EXIT_SUCCESS;
}

授人以渔,不授人以鱼。
2015-04-28 19:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
关键代码是如下部分:
程序代码:
    p = (unsigned char*)&value;
    for (index = 0; index < sizeof(value); ++index)
    {
        printf_s("%02X ", *p++);
    }


指针p声明为unsigned char*,它所指向的对象是一个unsigned char的数据,把value的入口地址赋值给p(此处必须用类型转换,把&value的指针解释为unsigned char*,才能把double型的数据块拆解为一个unsigned char數組)。sizeof(value)是获取double型数据类型在当前环境下的尺寸,在vs中,它的值是8,亦即double型是8字节64位的。for()循环简单地把从&value地址开始的8个字节依次顯示出来。这就是double型数据在内存中的存储映像。

图片附件: 游客没有浏览图片的权限,请 登录注册


要验证这个结果很简单:把value值用fwrite()輸出到一个二进制文件中,用EditPlus打开它以十六进制格式查看,就可以看到跟屏幕输出是一模一样的内存。换句话说,你想看数据在内存中的二进制形式,用这个办法把它輸出到文件中即可。

[ 本帖最后由 TonyDeng 于 2015-4-28 19:40 编辑 ]

授人以渔,不授人以鱼。
2015-04-28 19:20
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
T版主到底还是帮人家做作业了.
不过我觉得楼主要求“double型内存中的存储二进制表示”,可能是要分析十进制的浮点数转换二进制的转换规则,不是单纯要16进制表示的内存映像,按此要求我给的代码如下:
程序代码:
#include <stdio.h>
void setbin(char *buf,unsigned char *p,int l)
{//把p指向的长度为l的数据转换为二进制显示效果放到buf数组中
    int i,j,k,n,a;
    buf[0]=0;
    for(i=0,k=0;i<l;i++)
    {
        a=p[i];
        for(j=0;j<8;j++,k++)
        {
            if((l==4&&(k==23||k==31))||(l==8&&(k==52||k==63)))
            {//处理浮点数符号位、指数、尾数
                for(n=0;buf[n];n++);
                for(;n>=0;n--)buf[n+1]=buf[n];  //buf数组数据右移一位
                buf[0]='-';
            }
            for(n=0;buf[n];n++);
            for(;n>=0;n--)buf[n+1]=buf[n];  //buf数组数据右移一位
            buf[0]='0';
            if(a%2)buf[0]='1';
            a/=2;
        }
    }
}
void main()
{
    float a;
    double b;
    unsigned char *p;
    char c[255];
    printf("输入实数(q/Q退出):");
    while(scanf("%lf",&b))
    {
        a=(float)b;
        printf("显示数据:%f   显示格式:符号位-指数-尾数\n",b);
        p=(unsigned char*)&a;
        setbin(c,p,sizeof(a));
        printf("单精度:%s\n",c);
        p=(unsigned char*)&b;
        setbin(c,p,sizeof(b));
        printf("双精度:%s\n",c);
        printf("\n输入实数(q/Q退出):");
    }
}


能编个毛线衣吗?
2015-04-29 06:06
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
经测试,浮点数的二进制表示方式和http://介绍的不一样,对比图如下:
图片附件: 游客没有浏览图片的权限,请 登录注册

能编个毛线衣吗?
2015-04-29 06:18
快速回复:输出内存中的存储二进制
数据加载中...
 
   



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

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