Вы можете просто разыграть его с (uint) ptr, я считаю (если он не разыгрывается красиво, сначала попробуйте ptr.ToInt32 () или ToInt64 (). По крайней мере, я не знаю никаких проблем с этим подходом, хотя я этим не пользовался, поскольку UInt32 имеет больший диапазон, чем Int32, и так же, как Int64 на неотрицательной стороне, он должен быть достаточно хорошим.
Хотя не уверен, как ведет себя Int32 на 64-битных архитектурах. Плохо было бы представить, что причиной IntPtr является независимый от платформы способ хранения указателей.