Halois 2023-06-19 16:03 采纳率: 50%
浏览 40

汇编语言中real4、real8、real10的存储原理是什么

对于汇编语言中real4、real8、real10的存储原理一直搞不清楚。下面是我做的几个例子:


3.0用real4存储:
00 00 40 40
00000000 00000000 01000000 01000000
3.0用real8存储:
00 00 00 00 00 00 08 40
00000000 00000000 00000000 00000000 00000000 00000000 00001000 01000000
0.3用real4存储:
9A 99 99 3E
10011010 10011001 10011001 00111110
0.3用real8存储:
33 33 33 33 33 33 D3 3F
00110011 00110011 00110011 00110011 00110011 00110011 11010011 00111111
0.03用real4存储:
8F C2 F5 3C
10001111 11000010 11110101 00111100
0.03用real8存储:
B8 1E 85 EB 51 B8 9E 3F
10111000 00011110 10000101 11101011 01010001 10111000 10011110 00111111

  • 写回答

1条回答 默认 最新

  • 赵4老师 2023-06-19 17:26
    关注

    仅供参考:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main() {
        float f;
        double d;
        char bs[65];
        char b[65];
        char s[80];
        unsigned char *p;
        char e[12];
        char *t;
        int ex;
        int flag;
    
        flag=0;
        while (1) {
            printf("Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:");fflush(stdout);
            rewind(stdin);
            fgets(s,80,stdin);
            if ('\n'==s[0]) return 1;
            if (1==sscanf(s,"0x%16I64X",(__int64 *)&d) && strlen(s)>11) {flag=2;break;}
            if (1==sscanf(s,"0x%8X"    ,(  int   *)&f))                 {flag=1;break;}
            if (1==sscanf(s,"%f"       ,           &f)
             && 1==sscanf(s,"%lf"      ,           &d))                 {flag=3;break;}
        }
        if (flag&1) {
            printf("f=%g\n",f);
            p=(unsigned char *)&f;
            printf("hex=%02X %02X %02X %02X\n",p[3],p[2],p[1],p[0]);
            ltoa(*(long *)&f,b,2);
            sprintf(bs,"%032s",b);
            printf("bin=%s\n",bs);
            printf("bin=%.1s %.8s   %s\n",bs,bs+1,bs+9);
            strncpy(e,bs+1,8);e[8]=0;
            ex=strtol(e,&t,2);
            printf("    %c %-4d-127 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9);
            ex-=127;
            printf("    %c %-8d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9);
        }
        if (flag&2) {
            printf("\nd=%lg\n",d);
            p=(unsigned char *)&d;
            printf("hex=%02X %02X %02X %02X %02X %02X %02X %02X\n",p[7],p[6],p[5],p[4],p[3],p[2],p[1],p[0]);
            _i64toa(*(__int64 *)&d,b,2);
            sprintf(bs,"%064s",b);
            printf("bin=%s\n",bs);
            printf("bin=%.1s %.11s   %s\n",bs,bs+1,bs+12);
            strncpy(e,bs+1,11);e[11]=0;
            ex=strtol(e,&t,2);
            printf("    %c %-6d-1023 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12);
            ex-=1023;
            printf("    %c %-11d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12);
        }
    
        return 0;
    }
    //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0x3FC0000000000000
    //
    //d=0.125
    //hex=3F C0 00 00 00 00 00 00
    //bin=0011111111000000000000000000000000000000000000000000000000000000
    //bin=0 01111111100   0000000000000000000000000000000000000000000000000000
    //    + 1020  -1023 1.0000000000000000000000000000000000000000000000000000
    //    + -3          1.0000000000000000000000000000000000000000000000000000
    //
    //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0x3E000000
    //
    //f=0.125
    //hex=3E 00 00 00
    //bin=00111110000000000000000000000000
    //bin=0 01111100   00000000000000000000000
    //    + 124 -127 1.00000000000000000000000
    //    + -3       1.00000000000000000000000
    //
    //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0.125
    //f=0.125
    //hex=3E 00 00 00
    //bin=00111110000000000000000000000000
    //bin=0 01111100   00000000000000000000000
    //    + 124 -127 1.00000000000000000000000
    //    + -3       1.00000000000000000000000
    //
    //d=0.125
    //hex=3F C0 00 00 00 00 00 00
    //bin=0011111111000000000000000000000000000000000000000000000000000000
    //bin=0 01111111100   0000000000000000000000000000000000000000000000000000
    //    + 1020  -1023 1.0000000000000000000000000000000000000000000000000000
    //    + -3          1.0000000000000000000000000000000000000000000000000000
    //
    //Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:
    //
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 6月19日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上