【发布时间】:2012-09-25 05:28:12
【问题描述】:
谁能简单解释一下下面的代码:
public unsafe static float sample(){
int result = 154 + (153 << 8) + (25 << 16) + (64 << 24);
return *(float*)(&result); //don't know what for... please explain
}
注意:以上代码使用了unsafe函数
对于上面的代码,我很难过,因为我不明白它的返回值与下面的返回值有什么区别:
return (float)(result);
如果你返回*(float*)(&result),是否需要使用unsafe函数?
【问题讨论】:
-
我在 mscorlib/System/BitConvert/ToSingle 中找到了使用 ILSpy 的示例代码。没有给出任何解释。我需要了解流程是什么,因为我需要将其转换为 PHP。
-
重新区分
return (float)result;- 这是一个转换 - 它将整数123转换为浮点123.0F- 但那是不是 重新诠释的演员阵容;123和123.0F的字节完全不同。 re-interpretive 演员只是说“这里有 4 个字节;现在将它们视为float” -
以这种方式使用指针重新解释数据称为“类型双关”。
-
我很好奇这是否是将 4 个字节转换为浮点数的唯一方法。我知道它在 C 中,但指针的东西在那里也更常见
-
@gchimuel 要在 PHP 中执行此操作,请参阅stackoverflow.com/questions/2624869/bytes-convert-to-float-php,而不是尝试对一种完全不同的语言进行逆向工程。如果您已经有一个字节数组,只需使用 unpack。
标签: c# unsafe type-punning