размер переменной int

Как определяется размер int?

Правда ли, что размер int будет зависеть от процессора. Для 32-битной машины это будет 32 бита, а для 16-битной — 16.

На моей машине он отображается как 32-битный, хотя на машине установлен 64-битный процессор и 64-битная Ubuntu.


person Rohit    schedule 05.10.2012    source источник
comment
это также зависит от компилятора, потому что C не говорит о точном размере int.   -  person rbhawsar    schedule 05.10.2012


Ответы (6)


Это зависит от реализации. Единственное, что гарантирует стандарт C, это то, что

sizeof(char) == 1

и

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

а также некоторые представляемые минимальные значения для типов, которые подразумевают, что char имеет длину не менее 8 бит, int - не менее 16 бит и т. д.

Так что это должно быть решено реализацией (компилятором, ОС, ...) и задокументировано.

person Community    schedule 05.10.2012
comment
Я наткнулся на компилятор с расширением short long. int было 16 бит, а short long было 24. - person detly; 05.10.2012
comment
@detly У создателей этого компилятора определенно было чувство юмора. - person ; 05.10.2012
comment
Да, размер double был указан как 24 или 32. Это было для микропроцессора. - person detly; 05.10.2012
comment
@detly ты имеешь в виду микроконтроллер. - person ; 05.10.2012
comment
Эти гарантии неполные. Также должно быть, чтобы CHAR_BIT было не менее 8, sizeof(int) * CHAR_BIT должно быть не менее 16 и т. д. Подробнее см. здесь. - person GManNickG; 07.02.2013
comment
@GManNickG Правильно, исправлено. - person ; 07.02.2013
comment
Строго говоря, стандарт предъявляет требования к диапазонам целочисленных типов, а не к их размерам. При наличии битов заполнения возможно иметь sizeof (long) < sizeof (int), если int имеет больше битов заполнения, чем long. (Такая реализация маловероятна.) - person Keith Thompson; 21.03.2016
comment
Кроме того, с текущими стандартами long long гарантированно будет не менее 64 бит. - person cmaster - reinstate monica; 26.04.2018

Это зависит от компилятора.

Например: попробуйте старый компилятор Turbo C, и он даст размер 16 бит для int, потому что размер слова (размер, который процессор может адресовать с наименьшими усилиями) на момент написания компилятора был 16.

person loxxy    schedule 05.10.2012
comment
Быть (чрезвычайно) педантичным; это даст 2 вместо sizeof int, а в байте CHAR_BIT бит. sizeof возвращает количество байтов, и в байте не обязательно должно быть 8 бит. - person Ed S.; 05.10.2012

Это зависит от основного компилятора. если вы используете turbo c, это означает, что размер целого числа составляет 2 байта. в противном случае вы используете GNU gccompiler означает, что размер целого числа составляет 4 байта. это зависит только от реализации в компиляторе C.

person Manikandan Rajendran    schedule 05.10.2012

Размер целого числа в основном зависит от architecture вашей системы. Как правило, если у вас есть машина 16-bit, то ваша compiler должна поддерживать целое число size 2 byte.. Если ваша система 32-битная, то компилятор должен поддерживать 4 байта для целого числа.

Более подробно,

  • Концепция data bus появляется на картинке, да, 16-битная, 32-битная означает не что иное, как size of data bus в вашей системе.
  • Размер шины данных требуется для определения размера целого числа, потому что цель шины данных - предоставить данные процессору. Максимальное значение, которое она может предоставить процессору за одну выборку, важно, и этот максимальный размер предпочтителен для компилятор для предоставления данных во время.
  • Основываясь на этом размере шины данных вашей системы, компилятор предназначен для обеспечения максимального размера шины данных как размера целого числа.
x06->16-bit->DOS->turbo c->size of int->2 byte
x306->32-bit>windows/Linux->GCC->size of int->4 byte
person pradipta    schedule 05.10.2012
comment
спасибо за информацию, что насчет 64-битной версии Linux... в 64-битных системах шина данных будет иметь размер 64 бита, там также компилятор показывает 4 байта - person Rohit; 05.10.2012
comment
Идея заключается в том, что на 64-битной машине компилятор может поддерживать данные размером до 8 байт, что не означает, что он не может поддерживать 4 байта. Проще говоря, младшая система может быть совместима с более высокими системами, поэтому система 64-битная, но компилятор поддерживает до 32-бит, поэтому он показывает 4-байта, проверьте последнюю версию компилятора. - person pradipta; 05.10.2012

Делать int максимально широким — не лучший выбор. (Выбор делают разработчики ABI.)

64-битная архитектура, такая как x86-64, может эффективно работать с int64_t, поэтому вполне естественно, что long будет 64-битным. (Microsoft сохранила long как 32-битную в своем ABI x86-64 по различным причинам переносимости, которые имеют смысл, учитывая существующие кодовые базы и API. Это в основном не имеет значения, потому что переносимый код, который действительно заботится о размерах типов, должен использовать int32_t и int64_t вместо того, чтобы делать предположения. о int и long.)

Наличие int вместо int32_t на самом деле делает код лучше и эффективнее во многих случаях. Массив из int использует только 4 байта на элемент и имеет только половину объема кэш-памяти массива из int64_t. Кроме того, для x86-64 по умолчанию используется 32-битный размер операнда, поэтому для 64-битных инструкций требуется дополнительный байт кода для префикса REX. Таким образом, плотность кода лучше для 32-битных (или 8-битных) целых чисел, чем для 16- или 64-битных. (Ссылки на документы и руководства см. на вики x86. / образовательные ресурсы.)

Если программе для корректной работы требуются 64-битные целочисленные типы, она не будет использовать int. (Сохранение указателя в int вместо intptr_t является ошибкой, и мы не должны ухудшать ABI, чтобы приспособить такой неработающий код.) Программист, пишущий int, вероятно, ожидал 32-битного типа, поскольку большинство платформ работают именно так. (Стандарт, конечно, гарантирует только 16 бит).

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

Кроме того, должно быть имя для 32-битного целочисленного типа, чтобы int32_t было typedef для.

person Peter Cordes    schedule 21.03.2016

Да. int размер зависит от размера компилятора. Для 16-битного целого числа диапазон значений составляет от -32768 до 32767. Для 32- и 64-битных компиляторов он будет увеличиваться.

person Priyanka Gupta    schedule 07.02.2013