Следующее не требует небезопасного кода и доказано, что оно работает (я использовал его годами в различных версиях .NET):
[StructLayout(LayoutKind.Explicit)]
public struct FloatAndUIntUnion
{
[FieldOffset(0)]
public uint UInt32Bits;
[FieldOffset(0)]
public float FloatValue;
}
FloatAndUIntUnion f2i = default(FloatAndUIntUnion);
f2i.FloatValue = aFloat; // write as float
uint i = f2i.UInt32Bits; // read back as int
Обратите внимание, что направление float → int может быть проще:
int i = aFloat.GetHashCode();
Однако, это гораздо более неясно, потому что не задокументировано (согласно MSDN ), хотя подтверждено этим постом .(То есть в 2006 году поведение было таким же, как и в 2013 году, и я не вижу причин менять его в будущем - но это может произойти, и я не уверен, будет ли это рассматриваться как несовместимое с обратным изменением или нет.)