所以我试图将32位移植到64位。
我已打开VS2008标志以检测64位问题。
我正在尝试关注:
char * pList = (char *)uiTmp);
警告C4312:'type cast':从'unsigned int'转换为更大尺寸的'char *'
忽略代码本身。对于任何指针也是如此,因为为此目的,64位指针大于32位无符号int或int。
鉴于您必须将较小的类型转换为更大的类型,您将如何在两个32/64位系统上正确执行此操作
答案 0 :(得分:6)
这不是一个你可以忽略的警告,它将以64位代码炸弹。 unsigned int无法存储指针。没有任何魔法演员可以使这项工作。
检查代码并重新考虑将指针值存储在unsigned int中。它可能应该是一个空白*。如果你#include <windows.h>
那么你可以使用UINT_PTR。
答案 1 :(得分:3)
答案 2 :(得分:1)
从32位平台移动到64位平台时要注意的要点:
sizeof(int) != sizeof(void*)
了。审核所有出现的转换整数到指针并返回。 struct list
{
int val_;
struct list* next_;
};
我多次遇到的一个特定问题是,在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位将为零。