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

时间:2010-06-02 19:06:30

标签: c++ 32bit-64bit porting

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

我已打开VS2008标志以检测64位问题。

我正在尝试关注:

char * pList = (char *)uiTmp);

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

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

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

答案 2 :(得分:1)

从32位平台移动到64位平台时要注意的要点:

  • sizeof(int) != sizeof(void*)了。审核所有出现的转换整数到指针并返回。
  • 结构对齐和尺寸变化。例如,以下内容在32位上打包成8个字节,但在中间有一个洞,在64位上占用16个字节:
    struct list
    {
        int          val_;
        struct list* next_;
    };
  • IPC和网络通信的隐含假设会让你感到厌烦。

我多次遇到的一个特定问题是,在32位Linux上重复调用vprintf(3)而没有重新初始化va_list va_end/va_start默认工作(虽然是未定义的行为),但是由于不同的呼叫约定,在64位上大声炸弹。

答案 3 :(得分:0)

Basetsd.h标头具有various functions,用于在指针和整数之间进行转换。特别地,函数UIntToPtr可能是您想要的:

char * pList = UIntToPtr(uiTmp);

这将对给定的unsigned int值进行零扩展,即在64位版本中,pList指针的高32位将为零。