Какая разница между 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.