7
在C
我会这样做将数字的浮点数表示转换为DWORD。从地址获取值并将内容转换为DWORD。如何通过浮点表示将float转换为uint?
dwordVal = *(DWORD*)&floatVal;
因此,例如44.54321
将成为0x42322C3F
。
我该怎么做C#
?
在C
我会这样做将数字的浮点数表示转换为DWORD。从地址获取值并将内容转换为DWORD。如何通过浮点表示将float转换为uint?
dwordVal = *(DWORD*)&floatVal;
因此,例如44.54321
将成为0x42322C3F
。
我该怎么做C#
?
可以使用BitConverter
类:
uint value = BitConverter.ToUInt32(BitConverter.GetBytes(44.54321F), 0);
Console.WriteLine("{0:x}", value); // 42322c3f
你也可以做到这一点更直接使用unsafe
context:
float floatVal = 44.54321F;
uint value;
unsafe {
value = *((uint*)(&floatVal));
}
Console.WriteLine("{0:x}", value); // 42322c3f
不过,我强烈建议避免这一点。见Should you use pointers (unsafe code) in C#?
使用BitConverter类:
float f = 44.54321f;
uint u = BitConverter.ToUInt32(BitConverter.GetBytes(f), 0);
System.Diagnostics.Debug.Assert(u == 0x42322C3F);
其实'*(DWORD *)&floatVal'是错误的方式做在C,因为它打破了C编译器依靠优化严格别名规则。正确的方法涉及工会(参见C99tc3脚注82)或'memcpy()'。 –