歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 關於強制類型轉換(C語言)

關於強制類型轉換(C語言)

日期:2017/3/1 9:12:19   编辑:Linux編程
因為今天看的代碼中用到了結構體的強制類型轉換,就很想了解一下結構體的強制類型轉換是怎樣的。 一個結構體如下: 在下面這段代碼中rbuf->reqCmdBuf是一個空指針,首先將這個空指針賦值給一個uint8_t類型的指針buf。 然後將buf指針強制類型轉換為rdma_write_msg_head結構體類型指針。 那再這裡是怎麼轉換的呢? 首先,將buf指針指向的內容的前8個字節賦值給rdma_write_msg_head結構體的rwmh->len變量,然後再 將緊接著的1個字節的內容賦值給rwmh->flag。至於buf指針指向的內容中前9個字節後的內容,我認為會被捨棄掉。 在查詢強制類型轉換的資料時,看到了這樣一個例子:
將一個十六進制的數賦值給一個整型變量,然後試圖將這個整型轉換為浮點型。 1、首先直接對整型強制類型轉換得到的結果為1112539136.000000.如果是對整型變量的地址進行轉換,結果則不同。 2、可以看到,下圖中是對整型變量a的地址進行強制類型轉換,得到的結果為52.000000. 總結: 為什麼方法1和方法2得到的結果不同呢? 總結原因,可以這樣認為: 在方法1中,直接對整型變量a進行類型轉換,那麼會先將十六進制數作為整型處理,也就是1112539136, 將1112539136強制轉換為浮點型,那麼得到的結果就是1112539136.000000. 而在方法2中,將整型變量a的地址轉換為浮點型的,那麼要將變量a地址中的內存值轉換為浮點型,就是將 原地址值中的十六進制數按照浮點型的格式解釋,從而得到結果52.000000. PS.在測試實驗的過程中,犯了一個簡單的錯誤,從而得到了下面的問題: 在試圖輸出浮點型指針b的指針時,直接printf("%f",b);得到的結果為0.00000. 所以修改代碼為printf("%f",*b);得到了結果52.000000.但是如果保留printf("%f",b);會再一次輸出結果52.000000 一開始我以為這是codeblocks的編譯器進行了緩存做了什麼優化。但是在VC++編譯器中運行這段代碼得到了不同的結果。 在VC++中,同時出現printf("%f",*b);和printf("%f",b);輸出的結果分別是52.00000和0.00000;所以這有可能是編譯器的問題。

Copyright © Linux教程網 All Rights Reserved