前兩天同學問我一道面試題,如下:
int a=1;
printf("%f",a);
結果輸出是0.00000,好像這是和編譯器有關係的,我試驗在codeblock上,親測printf("%f",int)都會是0。
後來又試了試別的代碼:
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int a=0x43300000;
float b=*(float *) &a;
float c=(float)a;
cout << (float*) &a << endl; //1
printf("%f\n",b); //2
printf("%f\n",c); //3
return 0;
}
這樣會輸出什麼呢?看下圖
具體解釋:
1指的是先取a的地址,也就是0x6afef4,此時&a就可以看成一個指針*p,p==0x6afef4,不過指向的是int型的,然後(float*)p代表將p指向的地址變爲float型,輸出的時候還是個float型指針,所以是地址。
2指的是取1中說的float型的指針的內容,但本來是int型的數,按照float型的數來讀取就不一樣了,因爲float型內存中是分爲三部分的,符號位、指數位、尾數,具體可以搜一下float內存表示,推薦博客http://blog.csdn.net/nethibernate/article/details/6120382。
3指的是將a中的數據直接類型轉換,這時他的數不會變,所以和2不一樣。
PS:對*和&的理解
void f(int * a) // a 是一個int型的指針,a指的地址存放的是int型的數據
{
a // 取指針a的值(即地址)
*a // 取指針a指向的內容
&a // 取存放指針a的值的地址
}
如果a是一個數組
&a+1 = a + 1*sizeof(a); //如果數組a有100個數據,哪就移動100*sizeof(a[0])
a+1 = a +1*sizeof(a[0]); //僅移動sizeof(a[0])