Я не думаю, что это гарантировано.Стандарт гарантирует, что указатель, преобразованный в достаточно большое целое число и обратно, будет иметь свое первоначальное значение.Из этого следует, что существует отображение от указателей на подмножество соответственно больших целых чисел и обратно.Это не означает, что для каждого достаточно большого целочисленного значения существует соответствующее значение указателя…
Как указывает DavisHerring в комментариях ниже, это означает, что отображение является инъективным, но не имеетбыть сюръективным и, следовательно, биективным.Я полагаю, что стандарт подразумевает в математических терминах, что между указателями и целыми числами существует уникальная слева и общая сумма слева, а не биективная функция.
Просто представьте себе странную архитектуру, в которой по какой-то причинекаждый третий бит адреса должен быть нулевым.Или немного более разумная архитектура, которая использует только младшие 42 бита 64-битного значения для хранения адреса.Независимо от того, какой бы смысл это имело, компилятор мог бы предположить, что целочисленное значение, приводимое к указателю, должно следовать шаблону действительного адреса и, например, маскировать каждый третий бит или использовать только младший шесть байт.соответственно ...