將float
值的位模式複製到uint32_t
或反之亦然(而不是它們),我們可以使用std::copy
或memcpy
複製位字節到字節。另一種方法是如下使用reinterpret_cast
:複製位模式:浮點數到uint32_t
float f = 0.5f;
uint32_t i = *reinterpret_cast<uint32_t*>(&f);
或
uint32_t i;
reinterpret_cast<float&>(i) = 10;
但是有一個claim是說,兩名reinterpret_cast
上面使用,調用未定義的行爲。
這是真的嗎?怎麼樣?
正如答案所述,它是UB。一個斷言「sizeof(uint32_t)== sizeof(float)'雖然應該是所有你需要確信它會起作用的。 – NathanOliver
@NathanOliver但是,如果編譯器進行基於類型的別名優化,那麼如果你不提供'-fno-strict-aliasing'或其他東西,它可以合理地破壞行爲。 – TartanLlama
@TartanLlama好點。檢查'alignof'也可能是需要的。 – NathanOliver