Спецификация языка C позволяет реализовывать типы int и long для разных платформ в пределах нескольких ограничений. Эта изменчивость является головной болью для кроссплатформенного кода, но также является преимуществом, поскольку она позволяет информированному программисту сбалансировать свои цели проектирования между собственной скоростью процессора и полным числовым диапазоном на аппаратных архитектурах, которые не предлагают оба варианта.
В общем случае «int» должен отображать размер регистра машины машины целевой архитектуры ЦП, так что загрузка, хранение и работа с данными типа int должны напрямую переводиться в операции, использующие собственные регистры целевого процессора.
Int может быть меньше размера регистра машины в целях экономии места в памяти (большие целые занимают вдвое больше оперативной памяти, чем маленькие целые). Обычно это выглядит как 32-битный объект даже на 64-битных архитектурах, где совместимость со старыми системами и эффективность использования памяти являются первоочередными задачами.
"long" может быть того же размера или больше, чем "int", в зависимости от размеров регистров целевой архитектуры. Операции над «long» могут быть реализованы в программном обеспечении, если целевая архитектура не поддерживает значения, большие в собственных регистрах машин.
Микросхемы ЦП, предназначенные для энергоэффективности или встроенные устройства, - вот где вы найдете различия между int и long в наши дни. Компиляторы для процессоров общего назначения, таких как настольный компьютер или ноутбук, обычно обрабатывают int и long как один и тот же размер, поскольку процессор эффективно использует 32-битные регистры. На меньших устройствах, таких как сотовые телефоны, ЦП может быть построен для более естественной обработки 16-битных данных и должен усердно работать для обработки 32-битных или более крупных данных.
Меньше разрядов на регистр означает меньшее количество микросхем, требуемых в чипе, меньшее количество линий данных для перемещения данных в микросхему и из нее, более низкое энергопотребление и меньший размер кристалла кристалла, и все это обеспечивает меньшую стоимость (в долларах и ватт) устройство.
В такой архитектуре вы, скорее всего, обнаружите, что int имеет размер 16 бит и длинный 32 бит. Также может быть снижение производительности, связанное с использованием длинных, вызванное либо состоянием ожидания загрузки 32-битных данных при многократном чтении через 16-битную шину данных, либо вызванное реализацией длинных операций (сложение, вычитание и т. Д.) В программном обеспечении, если оно является собственным. Оборудование не поддерживает такие операции на оборудовании.
Как правило, единственное, что вы можете предположить о типах int и long, это то, что диапазон int всегда должен быть меньше или равен long в любой архитектуре. Вы также должны предположить, что когда-нибудь ваш код будет перекомпилирован для другой архитектуры, где больше не существует отношений, которые вы видите в настоящее время между int и long.
Вот почему вы должны быть осторожны, чтобы хранить целые отдельно от длинных даже в повседневном мирском кодировании. Сегодня они могут быть полностью совместимы с назначениями, потому что их детали реализации для вашей текущей аппаратной платформы совпадают, но это совпадение не гарантируется на всех платформах.