gpt4 book ai didi

将指针转换为 64 位整数,为什么在 32 位和 64 位平台上结果不同

转载 作者:太空狗 更新时间:2023-10-29 16:10:38 25 4
gpt4 key购买 nike

我有这样的代码片段(up.cpp):

#include <stdio.h>

typedef unsigned long long Uint64;
int main()
{
void *p = (void*)0xC0001234;
Uint64 u64 = (Uint64)p;
printf("{%llx}\n", u64);

return 0;
}

用 32 位 gcc 4.8.1 编译它,我得到输出:

{ffffffffc0001234}

用 64 位 gcc 4.8.1 编译它,我得到输出:

{c0001234}

是的,64 位的给出了 32 位的值。 gcc 4.8.1 来自 openSUSE 13.1。

我还在 Visual C++ 2010 x86 和 x64 编译器上尝试过(稍微更改了一些代码,__int64%I64x),令人惊讶的是得到了相同的结果。

当然,我打算在 x86 和 x64 上都获得 {c0001234}。但是为什么会有这样的差异呢?

最佳答案

这个的行为

Uint64 u64 = (Uint64)p;

不是由语言定义的。它是实现定义的。

虽然 64 位平台可能会将此实现为纯粹的概念转换(指针“填充”整个目标值),但在 32 位平台上,实现面临两难选择:如何将 32 位指针值扩展到一个 64 位整数值,带或不带符号扩展?显然,您的实现决定对值进行符号扩展。

显然,您的实现认为,在从指针到无符号的转换中,原始指针值应该充当某种有符号值。不过,这将是一个相当奇怪的决定。我无法在 GCC 中重现它:http://coliru.stacked-crooked.com/a/9089ccda625bd65d

如果这真的发生在您的平台上,您应该能够通过首先转换为 uintptr_t(作为中间类型)来抑制这种行为,正如@barak manos 在评论中所建议的那样。

关于将指针转换为 64 位整数,为什么在 32 位和 64 位平台上结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42178107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com