将12.0625转成IEEE表示的16进制数

来源:互联网 发布:财经类报纸 知乎 编辑:程序博客网 时间:2024/05/21 07:06
/// @file exam_1_1.c/** @brief    exam_1_1* 将12.0625转成IEEE表示的16进制数*/#include <stdlib.h>#include <stdio.h>void fn_float2IEEE_hand(); ///< 手工演算void fn_float2IEEE_auto(); ///< 用程序取值int main(int argc, char** argv){    fn_float2IEEE_hand();    fn_float2IEEE_auto();    printf("END, press any key to quit\n");    getchar();    return 0;}void fn_float2IEEE_hand(){    /**    exam_1_1* 将12.0625转成IEEE表示的16进制数    手工试算    12.0625 = 12 + 0.0625 = 1100.0001B        = 1100.0001B * 2^0 = 1.1000001B * 2^3        = 0x41410000    S = 0, 正浮点    S = 1, 负浮点    SED (S = 1bits, E = 8bits, D = 23bits)    S = 0    E = 127 + 3 = 130 = 1000,0010B    D = 1000001 补16个0(23 - 7 = 16) 0000000000000000      = 10000010000000000000000    130 = 1000,0010    SED = 0 10000010 10000010000000000000000        = 0100,0001,0100,0001,0000,0000,0000,0000        = 4    1    4    1    0    0    0    0        = 0x41410000    9 = 1001    A = 1010    B = 1011    C = 1100    D = 1101    E = 1110    F = 1111    130 / 2 = 65 => 0    65 / 2 = 32 => 1    32 / 2 = 16 => 0    16 / 2 = 8 => 0    8 / 2 = 4 => 0    4 / 2 = 2 => 0    2 / 2 = 1 => 0    从最后一个商数到第一个余数 10000010B, 必定是8位, 没见过其他位数    12 = 1100B    12 / 2 = 6 => 0    6 / 2 = 3 => 0    3 / 2 = 1 => 1    从最后一个商念到第一个余数 1100B    0.0625 = 0001B    0.0625    *    2    __________    0.1250 => 0    *   2    __________    0.250 => 0    *  2    __________    0.50 => 0    * 2    __________    0.0 => 1    从一个进位读到最后一个进位 0001B    */}void fn_float2IEEE_auto(){    float fObj = 12.0625f; ///< flosat在内存中占用4字节    int ary[1] = {0};    int iArrySubscript = 0; ///< 数组下标    int iIEEE = 0;        iArrySubscript = ((int)&fObj - (int)ary) / sizeof(int);    iIEEE = ary[iArrySubscript];    printf("fObj = %f, IEEE data on memory is 0X%X\n", fObj, iIEEE);    /** run result    fObj = 12.062500, IEEE data on memory is 0X41410000    */}

0 0