移植32到64位时处理问题的正确方法.从DT1转换为更大尺寸的DT2

gro*_*rtn 3 c++ porting 32bit-64bit

所以我试图将32位移植到64位.

我已经打开了VS2008标志来检测64位的问题.

我正在努力追随:

char * pList = (char *)uiTmp);
Run Code Online (Sandbox Code Playgroud)

警告C4312:'type cast':从'unsigned int'转换为更大尺寸的'char*'

忽略代码本身.对于任何指针也是如此,因为64位指针大于32位无符号int或int用于此目的.

鉴于您必须将较小的类型转换为更大的类型,您将如何在两个32/64位系统上正确执行此操作

Han*_*ant 6

这不是一个你可以忽略的警告,它将以64位代码炸弹.unsigned int无法存储指针.没有魔法演员可以使这项工作.

检查代码并重新考虑将指针值存储在unsigned int中.它可能应该是一个空白*.如果你#include <windows.h>那么你可以使用UINT_PTR.

  • 在任何具有`stdint.h`(在C99中是标准的,尽管MSVC++不支持)的环境中,使用`intptr_t`或`uintptr_t`.这些被定义为宽度足以容纳指针的整数类型. (2认同)
  • 考虑到它回答了一个完全不同的问题,我很好奇为什么这被接受了。问题是他试图将一个无符号的int存储到一个指针中,而不是相反。从物理上讲,它应该适合32位备用。 (2认同)

T.E*_*.D. 5

我有同样的问题。在我的例子中,代码试图使用 rand() 生成一个随机句柄,它返回一个 32 位值。(为什么它需要一个随机句柄值?不要问...)

我发现可以安抚编译器的方法如下:

char * pList = (char *)(0) + uiTmp; 
Run Code Online (Sandbox Code Playgroud)

如果您的系统使用 32 位或 64 位指针,这应该可以正常工作。当然,您可能不想在 64 位平台上使用 32 位整数,具体取决于您的代码到底在做什么。