【问题标题】:Proper way to handle issue when porting 32 to 64 bit. Conversion from DT1 to DT2 of greater size将 32 位移植到 64 位时处理问题的正确方法。从 DT1 转换为更大尺寸的 DT2
【发布时间】:2011-02-26 23:52:40
【问题描述】:

所以我正在尝试将 32 位移植到 64 位。

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

我正在尝试关注:

char * pList = (char *)uiTmp);

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

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

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

【问题讨论】:

  • 我想一个显而易见的问题是:为什么要将整数转换为指针?
  • 您要问的基本上似乎归结为“如何将 64 位数据写入 32 位变量”。答案可能会让您感到震惊和惊讶,但这是不可能的。如果要避免丢失数据,则必须将其写入指针大小的整数类型。
  • 您正在将 32 位类型转换为 64 位,因此它的存储空间绰绰有余。我不是在谈论当您尝试将指针存储到 int 时的情况(64 存储在 32 位当然不能工作)
  • 但显然(?)如果你从 int 中得到一个指针,你必须首先把它放在那里,这是真正的问题。
  • @T.E.D.除非你能保证你的代码不会被重定位到高内存地址,否则你不能使用那些 C 库。

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


【解决方案1】:

这不是您可以忽略的警告,它会在 64 位代码中爆炸。 unsigned int 不能存储指针。没有魔法可以使这项工作发挥作用。

查看您的代码并重新考虑将指针值存储在无符号整数中。它可能应该是一个 void*。如果你#include <windows.h>,那么你可以使用 UINT_PTR。

【讨论】:

  • 在任何具有stdint.h 的环境中(这是C99 中的标准,但遗憾的是MSVC++ 不支持),请使用intptr_tuintptr_t。这些被定义为足够宽以容纳指针的整数类型。
  • 我很好奇为什么这被接受了,因为它回答了一个完全不同的问题。问题是他试图将 unsigned int 存储到指针中,而不是相反。从物理上讲,它应该适合 32 位备用。
  • 这个答案显然是假设 uiTmp 应该包含一个指针值,分配到其他地方。另一种解释是没有意义的。好吧,无论如何,对我和 OP 来说。
【解决方案2】:

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

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

char * pList = (char *)(0) + uiTmp; 

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

【讨论】:

  • 我只需要它,因为指针被打印为十六进制(通过某些函数)。谢谢(回答问题)!
【解决方案3】:

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

  • sizeof(int) != sizeof(void*) 了。审核所有将整数转换为指针并返回的事件。
  • 结构对齐和大小发生变化。例如以下在 32 位上被打包成 8 个字节,但中间有一个洞,在 64 位上占用 16 个字节:
    struct list
    {
        int          val_;
        struct list* next_;
    };
  • 对 IPC 和网络通信的隐含假设会影响您。

我多次遇到的一个具体问题是,在 32 位 Linux 上重复调用 vprintf(3) 而不用 va_end/va_start 重新初始化 va_list 静默工作(虽然是未定义的行为),但在 64-由于调用约定不同而有点位。

【讨论】:

    【解决方案4】:

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

    char * pList = UIntToPtr(uiTmp);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-28
      • 2015-06-16
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2011-04-03
      相关资源
      最近更新 更多