Вот пример, где преобразование указателя в целое число может не привести к тому же самому указателю при преобразовании целого числа в указатель.
Учитывая архитектуру, которая имеет 24-битные адреса и использует две 16-битные величины для описания местоположения.Пусть одно количество будет СЕГМЕНТОМ, а другое - СМЕЩЕНИЕМ.Местоположение обозначается обозначением SEGMENT: OFFSET.
Фактический 24-битный (физический) адрес рассчитывается по формуле:
address = segment * 16 + offset.
Используя эту запись, может быть несколько пар SEGMENT: OFFSET, которые описывают один и тот же физический адрес.
При преобразовании в целое число используется 32-разрядная (без знака) величина (для упрощения внутренних вычислений в процессоре).Проблема заключается в том, как преобразовать физический адрес в тот же SEGMENT :: OFFSET, который использовался при создании физического адреса.
Общее уравнение для преобразования целого числа в указатель:
offset = address & 0xFFFF; // Mask off high order bits, keep lower 16.
segment = address >> 16; // Shift address right 16 bits, zero fill.
Хотя физический адрес этого нового сегмента и смещение равен физическому адресу исходного SEGMENT: OFFSET, сегменты и смещения не обязательно должны быть одинаковыми.
Для оптимизации кода существует процессоринструкции, которые используют относительную адресацию в сегменте.Эти инструкции могут испортиться при изменении значения SEGMENT из-за преобразования с физического адреса.
В этом случае возможно преобразование указателя в целое число.ОДНАКО, преобразование из целого числа в указатель НАСТОЯТЕЛЬНО ОБНАРУЖЕНО.Трудно исправить ошибки могут возникнуть во время выполнения.
Дополнительный вопрос: Можете ли вы назвать реальную архитектуру?