关于一道IEEE754浮点数标准的百度面试题再论

请猛戳出处!
作者解释的很清楚,看完之后,拿出手边的CSAPP,翻开2.4.2节的”IEEE浮点表示“P70-73一节再次默默观看并将代码敲到VS里面看看内存中是不是真的如作者所说。
 面试题代码
1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main(void)
{
    double a = 10;
    printf("a = %d\n", a);
    
    return 0;
}
结果确实如此。
然后,看完之后,顺便想看看float的如何,就把double改成float,发现结果竟然输出还是为0,但是内存观看器中却不是0,是如IEEE754规定的数值。
 C++ Code 
1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main(void)
{   
    float a = 10.0;
    printf("%x \n",a);

    return 0;
}
难道是因为编译器做了某些优化,看看在“float a = 10.0;”前面加上“volatile”,让编译器每次都从内存中读取数据,结果还是0。
 C++ Code 
1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main(void)
{   
    volatile float a = 10.0;
    printf("%x \n",a);

    return 0;
}
没办法,只能用指针了,代码修改如下:
 C++ Code 
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(void)
{   
    float a = 10.0;
    int* pa =&a;
    printf("%x \n",*pa);

    return 0;
}
嗯,这下结果按照IEEE754来的话就完全对了。
100000100 100000 00000000 0000000
exp             frac                                      

但是,这是为什么呢?此处我加上volatile来屏蔽掉寄存器的优化,但结果依旧,难道是编译器在这中间做了什么事么?
道行不够( ⊙ o ⊙ )啊!

你可能感兴趣的:(百度,面试题,IEEE754)