close

C語言中 union 用法

今天上C語言課的時候,老師突然問我怎麼把 float 在記憶體裡面的值印出來,當時我第一個想到的方法是先把變數存成 float,然後用 memcpy 複製到 char[4] 的陣列裡,然後從第四個開始 (因為x86是 Little Endian 排列) 印出來,就可以看到 float 在記憶體裡面存放的方式 (IEEE 754),參考程式如下:
int i;
float num=-1;
unsigned chat n[4];
memcpy(n, &num, sizeof(float);
for(i=3;i>=0;i--)
  printf("%x ", n[i]);

除了這方法外,老師另外告訴我一個 union (同構) 的方式,他的原理就是把同一塊記憶體,以不同型態的方式去看待他,有點像 OO 裡的 polymorphism。
老師說當初發明這個的用途是因為以前記憶體空間比較不足,因此許多變數共用同一塊記憶體比較節省,不過還有一個功能就是實現類似 OO 的 polymorphism,這點我還不是很清楚,以下就第一點先做範例說明:

int i;
union {
  float num;
  unsigned char n[4];
  } q;
//q.num=4;
q.num=-1;
for(i=3;i>=0;i--)
  printf("%x ", q.n[i]);

可以得到一樣的結果
IEEE 754:
-1 = -1.0*2^+127 = 1,0111 1111,0000...23個
所以結果: 1,011=B, 1111=F, 1000=8, 0000....=0,00,00 ==>BF800000


from:
http://ppc52776.blogspot.com/2007/11/c-union.html
arrow
arrow
    全站熱搜

    天才R 發表在 痞客邦 留言(0) 人氣()