页面载入中...

float 转换 DWORD 的陷阱

本以为是个很简单的东西,但其中隐藏了一个很大的陷阱:不能使用强制转换。亲手试试下面的几行代码就知道为什么了:

#include <stdio.h>
#include <Windows.h>

int main(int argc, char* argv[])
{
  float f = 2.0f;
  byte content[4];
  ::ZeroMemory(content, sizeof(content));

  memcpy(content, (byte*)&f, 4); // float 原始内容

  DWORD dw = (DWORD)f; // C 风格强制转换,错误
  memcpy(content, (byte*)&dw, 4);

  DWORD dw2 = *(DWORD*)&f; // 转换的正确做法
  memcpy(content, (byte*)&dw2, 4);

  DWORD dw3 = static_cast<DWORD>(f); // C++ 风格强制转换,错误
  memcpy(content, (byte*)&dw3, 4);

  return 0;
}

今天一整天全栽在这个上面了。

2条留言. 发言 or Trackback

留言 ↓

欢迎回来, (修改)

  • :em19:
  • :em01:
  • :em25:
  • :em09:
  • :em11:
  • :em00:
  • :em13:
  • :em08:
  • :em10:
  • :em03:
  • :em02:
  • :em05:
  • :em07:
  • :em16:
  • :em27:
  • :em14:
  • :em21:
  • :em20:
  • :em24:
  • :em18:
  • :em17:
  • :em06:
  • :em23:
  • :em12:
  • :em22:
  • :em15:
  • :em26:
  • :em04:

正在提交数据...