Каково различие между неподписанным, длинным/длинным/международным в c/c ++?

Кажется, что все они берут 4 байта пространства,

таким образом, каково различие?

19
задан user198729 31 March 2010 в 03:37
поделиться

3 ответа

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

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

Int может быть меньше размера машинного регистра в целях экономии места в памяти (большие целые числа занимают вдвое больше ОЗУ, чем маленькие целые числа).Обычно int как 32-битный объект даже на 64-битных архитектурах, где совместимость со старыми системами и эффективность памяти являются высокими приоритетами.

«long» может иметь такой же размер или больше, чем «int», в зависимости от размеров регистров целевой архитектуры. Операции с long могут быть реализованы программно, если целевая архитектура не поддерживает такие большие значения в собственных регистрах машины.

В микросхемах ЦП, разработанных для повышения энергоэффективности или встраиваемых устройств, в наши дни вы обнаружите различия между int и long. Компиляторы для процессоров общего назначения, таких как ваш настольный компьютер или ноутбук, обычно обрабатывают int и long одинакового размера, потому что процессор эффективно использует 32-битные регистры. На небольших устройствах, таких как сотовые телефоны, ЦП может быть построен для более естественной обработки 16-битных данных, и ему придется много работать для обработки 32-битных или больших данных.

Меньшее количество битов на регистр означает меньшее количество схем, требуемых на микросхеме, меньшее количество линий данных для передачи данных в микросхему и из нее, более низкое энергопотребление и меньший размер кристалла микросхемы, все это обеспечивает более низкую стоимость (в долларах и Вт) устройство.

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

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

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

9
ответ дан 30 November 2019 в 03:28
поделиться

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

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

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

4
ответ дан 30 November 2019 в 03:28
поделиться

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

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

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

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

25
ответ дан 30 November 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: