Кажется, все они берут 4 байта пространства,
так какая разница?
Кажется, все они берут 4 байта пространства,
так какая разница?
Прежде всего, размер int/long не указан. Поэтому в вашем компиляторе int
и long
могут быть одинаковыми, но это не универсально для всех компиляторов.
Что касается разницы между unsigned long
и long
:
Предполагая 4 байта, a long
имеет диапазон от -2,147,483,648
до 2,147,483,647
. Длина unsigned long имеет диапазон от 0
до 4,294,967,295
.
Еще одно отличие заключается в переполнении. Для подписанного типа переполнение имеет неуказанное поведение. Но для неподписанного типа переполнение гарантировано "обернуть".
Спецификация языка C позволяет реализовать типы int и long с одной платформы на другую в нескольких ограничениях. Эта изменчивость является головной болью для кросс-платформенного кода, но она также является активом, поскольку она позволяет информированному программисту балансировать их цели разработки между собственной скоростью процессора и полным числовым диапазоном на аппаратных архитектурах, которые не предлагают оба.
В общем случае предполагается, что "int" сопоставляет размер машинного регистра целевой архитектуры архитектуры ЦП, так что загрузка, хранение и работа с данными типа int должны транслироваться непосредственно в операции, которые используют родные регистры целевого процессора.
Int может быть меньше размера машинного регистра в интересах экономии места в памяти (большие int занимают в два раза больше ОЗУ, чем маленькие ints). Общепризнано, что int как 32-битный объект даже на 64-битных архитектурах, где высокая совместимость с более старыми системами и эффективностью памяти являются приоритетными.
"long" может быть того же размера или больше, чем "int" в зависимости от размеров регистра целевой архитектуры. Операции с "длинными" могут быть реализованы в программном обеспечении, если целевая архитектура не поддерживает значения, которые велики в своих собственных машинных регистрах.
Чипы CPU, предназначенные для энергоэффективности или встроенных устройств, - это то, где вы найдете различия между int и long в эти дни. Компиляторы для ЦПУ общего назначения, например, на вашем рабочем столе или ноутбуке, обычно обрабатывают int и длинные как один и тот же размер, потому что процессор эффективно использует 32-битные регистры. На более мелких устройствах, таких как сотовые телефоны, процессор может быть построен для обработки 16-битных данных более естественно и должен много работать для обработки 32-разрядных или больших данных.
Меньше бит на регистр означает меньше цепей, требуемых на чипе, меньшее количество строк данных для перемещения данных в чип и из него, более низкое энергопотребление и меньший размер кристалла кристалла, все из которых обеспечивают меньшую стоимость (в $и в Вт).
В такой архитектуре вы, скорее всего, найдете int размером 16 бит и длиной до 32 бит. Также может быть наказание за производительность, связанное с использованием longs, вызванное состояниями ожидания, чтобы загрузить 32 бита в нескольких чтениях по 16-битной шине данных или вызвано выполнением длительных операций (сложение, вычитание и т.д.) В программном обеспечении, если родной аппаратное обеспечение не поддерживает такие операции на оборудовании.
Как правило, единственное, что вы можете предположить о ints и longs, - это то, что диапазон int всегда должен быть меньше или равен длине любой архитектуры. Вы также должны предположить, что когда-нибудь ваш код будет перекомпилирован для другой архитектуры, где любые отношения, которые вы сейчас видите между int и long, больше не существуют.
Вот почему вы должны быть осторожны, чтобы держать ints отдельно от longs даже в повседневной мирской кодировке. Они могут быть полностью совместимы сегодня, потому что их детали реализации для вашей текущей аппаратной платформы совпадают, но это совпадение не гарантируется на всех платформах.
Ну, разница между unsigned long
и long
проста - верхняя граница. Подпись long
идет от (в среднем 32-битной системы) около -2,1 миллиарда (-2 ^ 31) до +2,1 миллиарда (+ 2 ^ 31 - 1), а unsigned long
- от 0 до 4,2 миллиарда (2 ^ 32 - 1).
Так получилось, что во многих компиляторах и операционных системах (включая, по-видимому, ваши) int
также является 32-битным значением. Но стандарт С++ не определяет максимальную ширину для любого из этих типов, только минимальную ширину. В некоторых системах int
- 16 бит. В некоторых системах long
- 64 бит. Многие из них зависят от целевой архитектуры процессора и размера базового слова.
Заголовок limits.h
существует для определения максимальной емкости различных типов в текущей среде компиляции, а stdint.h
существует для обеспечения не зависящих от среды типов гарантированной ширины, например int32_t
.