C определяет количество целочисленных типов и определяет отношение их размеров. В основном, это говорит о том, что sizeof (long long)> = sizeof (long)> = sizeof (int)> = sizeof (short)> = sizeof (char), а sizeof (char) == 1.
Но фактические размеры не определены и зависят от архитектуры, на которой вы работаете. На 32-битном ПК, int и long обычно четыре байта, а long long - 8 байт. Но в 64-битной системе длина обычно составляет 8 байтов и, следовательно, отличается от int.
Существует также тип, называемый uintptr_t (и intptr_t), который гарантированно имеет тот же размер, что и указатели данных.
Важно помнить, что не следует предполагать, что вы можете хранить значения указателя в long или int. Переносимость, вероятно, важнее, чем вы думаете, и вполне вероятно, что вы захотите скомпилировать свой код в 64-разрядной системе в ближайшем будущем.
Попробуйте выполнить компиляцию кода в режиме 64 бит и посмотреть, получаете ли вы те же результаты. – JeremyP