2014-04-07 72 views

回答

6
*(uint32_t*)(p) 

在存儲器位置提​​取32個無符號位。從在其天然類型的存儲器位置

(uint32_t)(*p) 

提取物p和施放該類型到一個32位的無符號整型。

如果p是浮點類型,結果可能是最顯着的。提取第一種方法時,您可以看到浮點數的結果按位格式(符號|指數)。當提取第二種方式時,數字轉換爲整數,可能通過某種形式的截斷。

這裏有一個有趣的例子程序:

main(){ 
    float x = 1.25, *xp = &x; 
    uint32_t x1 = (uint32_t)(*xp); 
    uint32_t x2 = *(uint32_t *)(xp); 
    printf("x1 = %x\nx2 = %x\n",x1,x2); 
} 

和輸出:

x1 = 1 
x2 = 3fa00000 
+0

+1地說明了爲什麼它讓你做哪種方式的差異。 –

+0

另一個重要的區別是,如果'p'不指向至少4個字節的內存(它可以指向頁面的最後一個字節,而不是另一個映射的頁面),或者'p '沒有正確對齊32位讀取(x86通常不關心,其他處理器並不總是如此寬容)。 –

+0

將原始位解釋爲整數的版本違反嚴格的別名規則,導致未定義的行爲。 – EOF

0

在前者中,首先將p轉換爲uint32_t*,然後對其進行解引用。
在後者中,首先,您取消引用p,然後將其轉換爲uint32_t