В чем разница между unsigned long / long / int в c / c ++? - PullRequest
17 голосов
/ 31 марта 2010

Кажется, все они занимают 4 байта пространства,

так в чем же разница?

Ответы [ 3 ]

24 голосов
/ 31 марта 2010

Прежде всего, размер int / long не указан. Так что в вашем компиляторе int и long могут быть одинаковыми, но это не универсально для всех компиляторов.

Что касается разницы между unsigned long и long:

Предполагая, что 4 байта, long имеет диапазон от -2,147,483,648 до 2,147,483,647. Длинна без знака имеет диапазон от 0 до 4,294,967,295.

Еще одно отличие заключается в переполнении. Для типа со знаком переполнение имеет неопределенное поведение. Но для неподписанного типа переполнение гарантированно «оборачивается».

9 голосов
/ 31 марта 2010

Спецификация языка 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.

Вот почему вы должны быть осторожны, чтобы хранить целые отдельно от длинных даже в повседневном мирском кодировании. Сегодня они могут быть полностью совместимы с назначениями, потому что их детали реализации для вашей текущей аппаратной платформы совпадают, но это совпадение не гарантируется на всех платформах.

3 голосов
/ 31 марта 2010

Ну, разница между unsigned long и long проста - верхняя граница. Значение long увеличивается (в среднем в 32-битной системе) с -2,1 млрд. (-2 ^ 31) до +2,1 млрд. (+ 2 ^ 31 - 1), а unsigned long - с 0 до 4,2 млрд. ^ 32 - 1).

Так получилось, что во многих компиляторах и операционных системах (включая, по-видимому, вашу) int также является 32-битным значением. Но стандарт C ++ не определяет максимальную ширину для любого из этих типов, только минимальная ширина. В некоторых системах int составляет 16 бит. В некоторых системах long составляет 64 бита. Во многом это зависит от целевой архитектуры процессора и его базового размера слова.

Заголовок limits.h существует для определения максимальной емкости различных типов в текущей среде компиляции, а stdint.h существует для предоставления независимых от среды типов гарантированной ширины, таких как int32_t.

...