如何将 64 位 void 指针转换为 32 位 void 指针?

Posted

技术标签:

【中文标题】如何将 64 位 void 指针转换为 32 位 void 指针?【英文标题】:How to convert 64bit void pointer into 32bit void pointer? 【发布时间】:2015-06-18 09:09:41 【问题描述】:

我有一个缓冲区(包含音频数据),它是空指针。在 32 位系统中,它的大小是 4 字节,在 64 位系统中,它的大小是 8 字节。那么如何在不丢失任何数据的情况下将 64 位 void 指针转换为 32 位 void 指针?

【问题讨论】:

一个系统上的指针不太可能在另一个系统上有效,因此指针的转换对您没有帮助。如果要在系统之间传输数据,则传输数据,并在目标系统上为其分配一个新的内存块(具有自己的地址)。 为什么要这样做?以及你如何准确地使用这个“指针”。 @SanderDeDycker:为什么不将此评论作为答案? @alk :我不确定我是否理解 OP 的意图,正在等待进一步的澄清。那从未到来...... 【参考方案1】:

只要 64 位指针 plus 中的值小于2^32,您就可以使用指针的低 32 位。例如uint32_ptr ptr32 = static_cast<uint32_ptr>(ptr64)。但是,像这样弄乱指针并不是最佳做法。

此外,我假设您将在同一台机器上的同一进程中使用这些指针。任何其他应用程序都会失败!

【讨论】:

好吧,你必须自己定义。您不能使用void*,因为它显然是 64 位的。所以你必须定义一个 32 位无符号整数类型来保存它的值。例如using uint32_ptr = uint32_t 将完成这项工作。将整数标记为 32 位指针只是表面上的说明。 我认为这是一个偏移量,而不是一个指针。指针绝对寻址内存。这对于 64 位环境中的 32 位宽整数不可能 确实如此。但据我所知,这是唯一的方法,如果我错了,请纠正我。

以上是关于如何将 64 位 void 指针转换为 32 位 void 指针?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 32 位 *.lib 文件转换为 64 位 *.a 文件

如何在 64 位应用程序中使用 32 位指针?

VS 编译MFC 32位转 64 位报错 ON_WM_TIMER()在编译器从32位转换为64位的时候, 出现的问题;

VS 编译MFC 32位转 64 位报错 ON_WM_TIMER()在编译器从32位转换为64位的时候, 出现的问题;

VS 编译MFC 32位转 64 位报错 ON_WM_TIMER()在编译器从32位转换为64位的时候, 出现的问题;

将 access mde 从 32 位转换为 64 位