2012年3月19日 星期一

[筆記] C 語言複雜型別閱讀規則

 作者  ie945167 (龍蝦)                                      站內  Lobster
 標題  [筆記] C 語言複雜型別閱讀規則
 時間  2012/03/19 Mon 00:55:42
───────────────────────────────────────

原文出處:
    http://ticore.blogspot.com/2012/03/c-language-complex-declartation.html

文章分享

大家好,我是 Ticore
剛開始接觸 C 語言,發現它的型別宣告真是超級複雜
除了一般型別之外,還有指標、陣列、函式指標
混在一起時真的是非常難懂
書上也沒找到一個系統性的閱讀規則

不斷的嘗試錯誤之後,歸納出來一些心得
首先是 C 語言宣告位置的一些限制


1. 所有型別符號 type specifier 只能放在變數名稱 identifier 左邊,
    e.g. int id;

2. 指標宣告 pointer declarator 只能放在變數名稱 identifier 左邊,
    e.g. int * id;

3. 陣列宣告 array declarator 只能放在變數名稱 identifier 右邊,
    e.g. int id [10];

4. 函式呼叫 function declarator 只能放在變數名稱 identifier 右邊,
    e.g. void id ( int i );

5. 群組運算子 grouping operator 必須包含變數名稱 identifier,
    e.g. int ( * id ) [10];

接下來是閱讀規則


1. 先以變數名稱 identifier 為基準,分為左半部與右半部

2. 先看 grouping 最外層的左半部,再看右半部

3. 左半部是從左到右閱讀,右半部是從右到左閱讀

4. 往內一層 grouping 閱讀,一樣是先看左半部,再看右半部

以此類推...


例子:
    見 blog 文章


--
▅◣ Origin:  謠 言 報  bbs.csie.fju.edu.tw
▋◤ Author: ie945167 從 219-84-254-78-adsl-kao.dynamic.so-net.net.tw 發表

[筆記] IEEE754 浮點數 轉換

 作者  ie945167 (龍蝦)                                      站內  Lobster
 標題  [筆記] IEEE754 浮點數 轉換
 時間  2012/03/19 Mon 00:18:57
───────────────────────────────────────

原文出處:
    http://edisonx.pixnet.net/blog/post/83095843


Float → Hex


先以 float 為例,假設宣告是

float f;
unsigned u;

要將 f 之記憶體內容拉到 u 裡面去,觀念是,

(1) 先將 float 取位址值                         --->                 &f
(2) 將位址內容轉型成 unsigned* 指標             --->      (unsigned*)&f
(3) 將對 unsigned* 指標做取值(dereference) 動作 --->     *(unsigned*)&f
(4) 再設給 u 值                                 ---> u = *(unsigned*)&f
(5) 再顯示 u 之 16 進位                         ---> printf("%8x\n", u);

u = *(unsigned*)&f;


Hex → Float

DWORD DW_Data;

float f = *(float*)&DW_Data;



PS.

1. 在轉換時會有誤差出現,需注意及特別處理

2. 負數部分我目前沒有試過

3. 上面的 (2) 我還是不懂這樣的做法,背後是怎麼運作的…0rz


--
▅◣ Origin:  謠 言 報  bbs.csie.fju.edu.tw
▋◤ Author: ie945167 從 219-84-254-78-adsl-kao.dynamic.so-net.net.tw 發表