int32_t a; float b = 123.5f;a = (int32_t)b; // 或 a = (int)b;
cvttss2si)。a == 123。
a = *(int32_t *)&b; // 經典別名訪問
// 或 C99 聯合體寫法(標準合規)
union { float f; int32_t i; } u;
u.f = b;
a = u.i;
b 佔用的 4 字節內存原樣視為 int32_t,不做任何數值轉換。a == 0x42F6E000 (IEEE 754 中 123.5 的位模式)。0x5f3759df 快速逆平方根)。C 標準規定:不同類型指針不得指向同一內存(char* 除外)。*(int32_t*)&b 違反此規則,屬未定義行為(編譯器優化可能導致錯誤)。
| 寫法 | 標準合規性 | 備註 |
|---|---|---|
*(int32_t*)&b | ❌ 違反嚴格別名 | GCC/Clang -O2 可能誤編譯 |
聯合體 union {float f; int32_t i;} | ✅ C99 明確允許 | 推薦方式 |
memcpy(&a, &b, 4) | ✅ 完全合規 | 編譯器優化為單指令,無開銷 |
(int32_t)b | ✅ 語義轉換 | 非位模式複製 |
(int)b。memcpy 為安全 API。