gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:10:48 26 4
gpt4 key购买 nike

给定一个整数类型 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com