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


因為今天看的代碼中用到了結構體的強制類型轉換,就很想了解一下結構體的強制類型轉換是怎樣的。
一個結構體如下:
在下面這段代碼中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;所以這有可能是編譯器的問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM