學到一個有趣的方法,在 float 做快速的轉換.
[StructLayout(LayoutKind.Explicit)] public struct SampleUnion { [FieldOffset(0)] public float f = 1; [FieldOffset(0)] public int i; }
這邊需要先了多的是 C# 定義 variable 的時候其實 compiler 會自己跑去 memory 幫你決定每在 local variables 在 memory layout 上的位置.
而這邊的 “StructLayout(LayoutKind.Explicit)”
Explicit 就是告訴 C# 由我們來決定每個 variable 的記憶體位置.
“FieldOffset(#)” 就是定義接下來的變數在記憶體上的位置.
所以當 float & int 兩個都是 4 bytes 的 variable 都在 memory layout 的起始位置的話
就變成 4byte * 8 bits, 整整 32 bits 的記憶體重疊在同一個 memory block 裡面.
所以就可以透過 “i” 來拿到 “f” 的值, 但不是正常的轉換. 但處於 int 的情況下,如果不是用來做數值運算的話.
就可以用 bitwise 的方式來處理很多轉換而不需考慮 floating 的小數精度問題.