对于const char *p
,如果两个选项都编译,是否可以保证(uint64_t)(uintptr_t)p
与(uint64_t)p
具有相同的值?
答案 0 :(得分:4)
对于目标使用例如的编译器是完全合法的(甚至合理的)。由16位段和32位偏移量组成的48位指针(分段模型80386以这种方式工作)通过存储16位段和32位偏移量到目标对象来处理到uint64_t
的转换,剩下的16位保留之前发生的所有操作,只要从uint64_t
返回到指针的转换忽略了所讨论的位。对于这样的平台,将uintptr_t
定义为uint64_t
的同义词,并以相同的方式处理对uint64_t
的转换也是合理的。
关于转换的所有保证都是(void*)p==(void*)(uintptr_t)p
。无法保证(uintptr_t)p == (uintptr_t)p
,甚至不能保证通过双向转换产生的指针都可以以任何方式被有意义地取消引用。
答案 1 :(得分:0)
仅当uintptr_t
代表的数字范围全部由uint64_t
代表时才是正确的。实际上,在32位和64位平台上都是如此,但例如,如果存在128位平台,则不是这样。
您真的不应该依赖于此,而只需坚持使用uintptr_t
,在这里需要将指针作为整数。