如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?

Is reinterpret casting an integer to a pointer bijective if the integer is the same size as a pointer?

本文关键字:指针 整数 转换 作用 解释 是否 如果 新解释      更新时间:2023-10-16

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

这让我感到好像答案必须是"是",因为规范指出存在到任何足够大的整数的映射,以容纳指针值。 如果变量大小相同,则该映射必须是双射的。 如果它是双射的,那么这也意味着从intvoid*的转换也必须是双射的。

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

我认为这不能保证。标准保证转换为适当大的整数并返回的指针将具有其原始值。由此可见,从指针到适当大整数的子集并返回。它并不意味着对于每个适当大的整数值,都有一个相应的指针值......

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

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