c++ - 如果整数与指针的大小相同,是否将整数重新解释为指针双射?

标签 c++ pointers reinterpret-cast

给定一个整数类型 IntT这样 sizeof(IntT) == sizeof(void*) ,以及所述类型的变量 i , 是否保证reinterpret_cast<IntT>(reinterpret_cast<void*>(i)) == i ?这类似于 this question ,但这个问题是在寻找任意大小的整数,所以答案是直接否定。将其限制为与指针大小完全相同的整数会使其更有趣。

我觉得答案似乎必须是"is",因为规范指出存在到任何大到足以容纳指针值的整数的映射。如果变量大小相同,则该映射必须是双射的。如果它是双射的,那么这也意味着从 int 的转换至 void*也必须是双射的。

但是这个逻辑有漏洞吗?规范中是否有我没有考虑到的摇摆不定的词?

最佳答案

我不认为这是有保证的。该标准保证指针转换为适当大的整数并返回时将具有其原始值。由此可知,存在从指针到适当大整数的子集并返回的映射。它并不意味着对于每个适当大的整数值,都有一个对应的指针值……

正如 DavisHerring 在下面的评论中所指出的,这意味着映射是单射的,但不一定是满射的,因此是双射的。我相信该标准在数学术语中暗示的是指针和整数之间存在左唯一和左总关系,而不是双射函数。

想象一下一些奇怪的架构,由于某种原因,地址的每三个位必须为零。或者稍微更合理的架构,仅使用 64 位值的低 42 位来存储地址。不管这有多大意义,编译器可以自由地假设一个整数值被转换为一个指针必须遵循有效地址的模式,例如,屏蔽掉每三个位或只使用较低的六个字节分别……

关于c++ - 如果整数与指针的大小相同,是否将整数重新解释为指针双射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52770134/

相关文章:

C++ reinterpret_cast 安全与数组引用和移动/复制赋值

c++ - 为对象 ID 选择随机数?

c++ - vc++中如何获取windows时间?

c++ - 流的重载产生两种不同的结果

c++ - 编译运行 OpenMPI 程序

c - 为什么参数的值没有随着该变量的传递地址而增加?

c - 指针引用: What's the difference between pointer referencing in number 1 and 2.

C++ 比较共享指针的堆栈

c++ - 我可以举一个现实生活中的例子,其中通过 void* 进行强制转换而 reinterpret_cast 无效吗?

c++ - Windows 中的 MongoDB C++ 驱动程序入门