当编译为32位进程时,以下代码打印ffffffff82223333
而不是82223333
,因此在转换为uint64_t
时,指针似乎总是符号扩展。那是为什么?
#include <stdint.h>
#include <stdio.h>
int main()
{
void *p = (void*) 0x82223333;
uint64_t x = (uint64_t) p;
printf("%llx\n", x);
}
我认为地址永远不会是负面的,所以它应该被视为无符号。
我的问题也与此question有关(因为Windows句柄只是指针的typedef)。
Similar question,但仍无法解释为什么编译器开发人员会选择这样做。