十进制小数转十六进制

请问这两道

img


怎么做呀?为什么十进制-4.5是C803而不是C800?

img

不知道你们课堂上是怎么讨论的,建议你去翻翻课堂笔记。

十进制-4.5是C803而不是C800,我猜二进制的结构大约是符号位占1位,整数位占3位的意思。据此,可以大致推断:

-13.25 对应的二进制是 1110 1010 0000 0100,即EC04
-0.1875 对应的二进制是 1000 0011 0000 0011,即8303
0.375 对应的二进制是 0000 0110 0000 0011,即0603
2020 对应的二进制是 0111 1110 0100 1011,即774B

如果这个推断正确的话,十六进制7802 等价于十进制3.75,倒是正好符合推论。E40A表示-800,4305表示16.75,也可以说得通。但是6BCD和7A0D,最后都是13,就有点无从下手了。

以上纯属瞎猜,仅供参考。总之,解决问题还得要依赖课堂上的讨论或者课本上的东西。

仅供参考:

#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:
//


是不是整数数部分+小数部分的,主要是你的课堂上讲的规则是什么?

011.1 1000 0000 0010
3.75

111.0 0100 0000 1010
7.125

010.0 0011 0000 0101
2.09375

011.0 1011 1100 1101
3+1/4+1/16+1/32+1/64+1/128=3.3671875

-4 .5
1100 1000 0000 0011

这篇文章讲的很详细,请看:十六进制转十进制