如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
Is reinterpret casting an integer to a pointer bijective if the integer is the same size as a pointer?
给定一个整数类型IntT
使得sizeof(IntT) == sizeof(void*)
,以及所述类型i
的变量,是否保证reinterpret_cast<IntT>(reinterpret_cast<void*>(i)) == i
? 这类似于这个问题,但这个问题是查看任何任意大小的整数,所以答案是直截了当的否定。 将其限制为与指针大小完全相同的整数会使其更有趣。
这让我感到好像答案必须是"是",因为规范指出存在到任何足够大的整数的映射,以容纳指针值。 如果变量大小相同,则该映射必须是双射的。 如果它是双射的,那么这也意味着从int
到void*
的转换也必须是双射的。
但这个逻辑有漏洞吗? 规范中是否有我没有考虑的摆动词?
我认为这不能保证。标准保证转换为适当大的整数并返回的指针将具有其原始值。由此可见,从指针到适当大整数的子集并返回。它并不意味着对于每个适当大的整数值,都有一个相应的指针值......
正如DavisHerring在下面的评论中指出的那样,这意味着映射是单射的,但不一定是满射的,因此是双射的。我相信该标准在数学术语中的含义是指针和整数之间存在左唯一和左总关系,而不是双射函数。
想象一下一些奇怪的架构,由于某种原因,地址的每三个位必须为零。或者稍微合理的体系结构,仅使用 64 位值的较低 42 位来存储地址。无论这有多大意义,编译器都可以自由地假设被强制转换为指针的整数值必须遵循有效地址的模式,例如,屏蔽每三位或仅使用较低的六个字节分别......
相关文章:
- 整数键映射到头文件中的成员函数指针
- 如何实现容纳整数和无效指针的双向链表?
- 使用指针将 ASCII 值添加到整数
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 在C++中,如果我可以直接将整数分配给指针而不使用"new",为什么要使用"new"?
- 取消引用指向整数的指针时获得不同的结果
- 为什么此指针值不能转换为整数的规则是什么?
- 禁止指针和整数之间的比较C++
- 为什么在将 void 指针转换为整数指针时出现分段错误
- ISO C++禁止指针和整数 [-fpermissive] [c++] 之间的比较
- 指向整数数组和打印总和的指针
- 将uint64_t转换为字节时从不同大小的整数强制转换为指针
- Qt 错误 iso c++ 禁止指针和整数之间的比较 -permissive
- 如何在 c++ 中动态声明指向整数的指针数组?
- C++:这是使用整数变量作为函数调用指针的正确方法吗
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- 创建<int>对整数数组指针的矢量引用 (C++)
- 整数指针数组的元素是否可以指向整数数组?
- 将指针整数(int**)转换为c中的String
- 为什么此指针/整数比较会生成分段错误