因為今天看的代碼中用到了結構體的強制類型轉換,就很想了解一下結構體的強制類型轉換是怎樣的。
一個結構體如下:





在下面這段代碼中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;所以這有可能是編譯器的問題。


