在 C 语言中将 64 位值转换为 32 位指针时如何避免警告 PE1053?

How to avoid warning PE1053 when casting a 64-bit value to a 32-bit pointer in C?

提问人:Cris 提问时间:6/1/2023 最后编辑:sepp2kCris 更新时间:6/1/2023 访问量:53

问:

我想支持我的代码的 32 位和 64 位版本。 我的架构有一个静态非易失性存储器,我可以在其中存储数据。但是变量大小是静态的,所以我更改了它。因此,我使用一个 64 位变量来存储地址指针。这适用于 32 位和 64 位。

我在初始化阶段存储一个 64 位变量的地址(u64 前缀表示无符号 int 64 位变量)。

初始化

extern MEMORY tNonVolatileMemory;
MY_TYPE tType;

// Can be 32 bit in 32 Bit version
tNonVolatileMemory.u64Address = &tType;

当我想重用该地址时,会出现编译器错误:

警告[Pe1053]:从整数到较小指针的转换

运行

extern MEMORY tNonVolatileMemory;
MY_TYPE* ptType; 

ptType = (MY_TYPE*)tNonVolatileMemory.u64Address;

是否有任何编程方法可以避免此警告?

我试图将拳头投向一个空指针以避免编译器警告

c 警告

评论

2赞 Eugene Sh. 6/1/2023
此警告特定于编译器。编译器可能有办法抑制它。您没有告诉我们您使用的是哪种编译器。
2赞 Eugene Sh. 6/1/2023
无论如何,最好将类型(和名称)更改为特定于体系结构的内容。将其设置为指针类型或旨在保存指针值的整数,例如u64Addressuintptr_t
2赞 Eric Postpischil 6/1/2023
如果不想更改 的类型,请在转换为指针之前将其转换为 。u64Addressuintptr_tptType = (MY_TYPE *) (uintptr_t) tNonVolatileMemory.u64Address;
1赞 Lundin 6/1/2023
stdint.h是可移植代码的关键。你所有的整数都应该是该库中固定宽度的整数。要解决指针问题,应在以整数格式存储指针地址时使用。这是一种便携式类型,保证足够大,可以容纳给定系统上的指针。至于如何修复你的代码,你必须发布结构/类型定义。uintptr_t
2赞 John Bollinger 6/1/2023
首先,您转换为整数类型或从整数类型转换是否有特殊原因?为什么不直接存储指针呢?

答:

3赞 chux - Reinstate Monica 6/1/2023 #1

在 C 语言中将 64 位值转换为 32 位指针时如何避免警告 PE1053?
“我使用 64 位变量来存储地址指针”

使用指针变量来存储指针,而不是强制转换。

extern void *tNonVolatileMemory;

tNonVolatileMemory = &tType;

如果希望该变量在 32 位地址计算机和 64 位地址计算机上始终占用相同的空间,请使用 .union

_Static_assert(sizeof (void *) <= sizeof(uint64_t), "Pointer too large");
union {
  void *ptr;
  uint64_t u64;
} tNonVolatileMemory;

tNonVolatileMemory.ptr = &tType;