Какая разница между unsigned long/long/int в c/С++?
Кажется, все они берут 4 байта пространства,
так какая разница?
Ответы
Ответ 1
Прежде всего, размер 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
.
Еще одно отличие заключается в переполнении. Для подписанного типа переполнение имеет неуказанное поведение. Но для неподписанного типа переполнение гарантировано "обернуть".
Ответ 2
Спецификация языка 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 даже в повседневной мирской кодировке. Они могут быть полностью совместимы сегодня, потому что их детали реализации для вашей текущей аппаратной платформы совпадают, но это совпадение не гарантируется на всех платформах.
Ответ 3
Ну, разница между 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
.