各位大神想求助一下规格化浮点数的范围怎么求呀

32位的操作系统,符号位占一位,阶码部分占8位,尾数部分占23位。
答案是±2^-1*5^-128……±(1-2^-24)*2^127
各位大神,知道这个结果怎么来的吗?
求求了,求求了。

32位的操作系统,符号位占一位,阶码部分占8位,尾数部分占23位。
如果你能说出这个,说明你对float 已经很了解了。

  1. 符号位 1 位,用以确定该值为正、负;
  2. 指数部分 8 位,取值是相对于127 (重点),所以,如果该部分值为1000 0000,减去127,值为1,也就是2^1 次方;如果这个地方为0,那减去127,就是2^-127 次方;所以,这8位,表示2 的-128~127 次方;
  3. 尾数部分 23位,这个就是包括整数、小数部分,进行偏移后的结果;
    例如,一个十进制数10.23,用二进制表示的数为1010.001110,
    首先,是个正数,所以符号位位0;
    接着,往右偏移3位,变成1.010001110,那么指数部分就是+3次方,相对于127之后就是130,也就是这部分存的值为130;
    最后生下来的部分存放在尾数部分,即010001110 存放在尾数部分;
    所以,内存中应该是010000010010001110
    希望帮到你了,有什么问题,随时欢迎交流~~~~

仅供参考:

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