Переменная Integer в C занимает 2 байта или 4 байта? От каких факторов это зависит?
В большинстве учебников говорится, что целочисленные переменные занимают 2 байта. Но когда я запускаю программу, печатающую последовательные адреса массива целых чисел, это показывает разницу 4.
int
это просто один из нескольких целочисленных типов. Вы спрашивали о размере "целое число"; Вы, вероятно, хотели спросить о размереint
.int
является 2 байтами (а), вероятно, относится к старой системе, и (б) не дает понять, что размер будет варьироваться от одной системы к другой. Лучшая книга по Си - «Язык программирования Си» Кернигана и Ричи, хотя он предполагает некоторый опыт программирования. См. Также вопрос 18.10 в comp.lang.c FAQ .#define int int64_t
на 64-битной платформе, так что ни того, ни другого. Просто используйтеsizeof
. ;-)Ответы:
Я знаю , что это равно
sizeof(int)
. Размерint
действительно зависит от компилятора. В те времена, когда процессоры были 16-битными,int
было 2 байта. В настоящее время это чаще всего 4 байта в 32-разрядных и 64-разрядных системах.Тем не менее, использование
sizeof(int)
- лучший способ получить размер целого числа для конкретной системы, на которой выполняется программа.РЕДАКТИРОВАТЬ: Исправлено неправильное выражение, которое
int
составляет 8 байт в большинстве 64-разрядных систем. Например, это 4 байта на 64-битном GCC.источник
sizeof(int)
может быть любым значением от1
. Байт не обязательно должен быть 8 битами, а некоторые машины не имеют 8-битной адресуемой единицы (что в основном является определением байта в стандарте). Ответ не верен без дополнительной информации.Это одна из точек в C, которая может сначала сбить с толку, но стандарт C определяет только минимальный диапазон для целочисленных типов, который гарантированно поддерживается.
int
гарантированно может содержать от -32767 до 32767, что требует 16 бит. В этом случаеint
, это 2 байта. Однако реализации могут выйти за пределы этого минимума, как вы увидите, что многие современные компиляторы делаютint
32-битные (что также означает, что 4 байта довольно повсеместно).Причина, по которой ваша книга говорит о 2 байтах, скорее всего потому, что она старая. Когда-то это было нормой. В общем, вы всегда должны использовать
sizeof
оператор, если вам нужно выяснить, сколько байтов на платформе вы используете.Чтобы решить эту проблему, C99 добавил новые типы, где вы можете явно запросить целое число определенного размера, например
int16_t
илиint32_t
. До этого не было универсального способа получить целое число определенной ширины (хотя большинство платформ предоставляло похожие типы для каждой платформы).источник
int
. С не делает этого предположения. Системы дополнения и величины знака 1 не могут быть представлены-32768
в 16 битах; скорее, они имеют два представления для нуля (положительное и отрицательное). Поэтому минимальный диапазон дляint
это[-32767..32767]
.Там нет конкретного ответа. Это зависит от платформы. Это определяется реализацией. Это может быть 2, 4 или что-то еще.
Идея
int
заключалась в том, что он должен был соответствовать естественному размеру «слова» на данной платформе: 16-битная на 16-битных платформах, 32-битная на 32-битных платформах, 64-битная на 64-битных платформах. Однако в целях обратной совместимости некоторые компиляторы предпочитают придерживаться 32-разрядныхint
даже на 64-разрядных платформах.Время 2-х байт
int
уже давно прошло (16-битные платформы?), Если только вы не используете какую-то встроенную платформу с 16-битным размером слова. Ваши учебники, вероятно, очень старые.источник
The idea behind int was that it was supposed to match the natural "word" size on the given platform
- Это то, что я искал. Есть идеи, в чем причина? В свободном мире int может занимать любое количество последовательных байтов в памяти, верно? 8, 16, что угодноОтвет на этот вопрос зависит от того, какую платформу вы используете.
Но независимо от платформы вы можете надежно предположить следующие типы:
источник
Это зависит от платформы, которую вы используете, а также от конфигурации вашего компилятора. Единственный надежный ответ - использовать
sizeof
оператор, чтобы увидеть, насколько велико целое число в вашей конкретной ситуации.Лучше всего рассмотреть диапазон , а не размер . И то, и другое будет отличаться на практике, хотя гораздо более надежно выбирать типы переменных по диапазону, чем по размеру, как мы увидим. Также важно отметить, что стандарт побуждает нас рассмотреть возможность выбора целочисленных типов на основе диапазона, а не размера , но сейчас давайте проигнорируем стандартную практику и позволим нашему любопытству исследовать
sizeof
байтыCHAR_BIT
и целочисленное представление ... кроличью нору и сами все увидим ...sizeof
, байтов иCHAR_BIT
Следующее утверждение, взятое из стандарта C (ссылка на которое приведена выше), описывает это словами, которые, я думаю, не могут быть улучшены.
При условии четкого понимания мы приведем к обсуждению байтов . Обычно предполагается, что байт составляет восемь битов, когда фактически
CHAR_BIT
говорит вам, сколько битов в байте . Это просто еще один из тех нюансов, который не учитывается при разговоре об общих двух (или четырех) байтовых целых числах .Давайте подведем итоги:
sizeof
=> размер в байтах иCHAR_BIT
=> количество бит в байтеТаким образом, в зависимости от вашей системы,
sizeof (unsigned int)
может быть любое значение больше нуля (а не только 2 или 4), как если быCHAR_BIT
это было 16, то один (шестнадцатиразрядный) байт содержит достаточно битов, чтобы представить шестнадцатибитовое целое число, описываемое стандарты (цитируется ниже). Это не обязательно полезная информация, не так ли? Давайте углубляться глубже ...Целочисленное представление
В C стандарт устанавливает минимальные точности / дальность для всех стандартных целочисленных типов (и
CHAR_BIT
, тоже, FWIW) здесь . Из этого мы можем получить минимум для того, сколько бит требуется для хранения значения , но мы можем также просто выбрать наши переменные на основе диапазонов . Тем не менее, огромная часть деталей, необходимых для этого ответа, находится здесь. Например, следующее, что стандартunsigned int
требует (по крайней мере) шестнадцать бит хранения:Таким образом, мы можем видеть, что
unsigned int
требуется ( как минимум ) 16 битов , и именно здесь вы получаете два байта (предполагая, чтоCHAR_BIT
это 8) ... и позже, когда этот предел увеличился до2³² - 1
, люди указали вместо этого 4 байта. Это объясняет явления, которые вы наблюдали:Вы используете древний учебник и компилятор, который учит вас непереносимым Си; автор, написавший ваш учебник, может даже не знать об этом
CHAR_BIT
. Вы должны обновить свой учебник (и компилятор) и стремиться помнить, что информационные технологии - это постоянно развивающаяся область, в которой вам нужно быть впереди, чтобы конкурировать ... Впрочем, хватит об этом; давайте посмотрим, какие еще непереносимые секреты хранятся в этих целочисленных байтах ...Биты значений - это то, что, по-видимому, считают обычными заблуждениями. В приведенном выше примере используется
unsigned
целочисленный тип, который обычно содержит только биты значений, поэтому в деталях легко пропустить дьявола.Подписывать биты ... В приведенном выше примере я указал
UINT_MAX
верхний предел,unsigned int
потому что это тривиальный пример извлечения значения16
из комментария. Для типов со знаком, чтобы различать положительные и отрицательные значения (это знак), мы также должны включить бит знака.Биты заполнения ... Хотя встречаться с компьютерами, у которых биты заполнения являются целыми числами, нечасто, стандарт C допускает это; некоторые машины (т.е. этот ) реализуют большие целочисленные типы, комбинируя два меньших (знаковых) целочисленных значения вместе ... и когда вы объединяете целые числа со знаком, вы получаете потерянный знаковый бит. Этот потерянный бит считается заполнением в C. Другие примеры битов заполнения могут включать биты четности и биты прерывания .
Как вы можете видеть, стандарт, кажется, поощряет учитывать диапазоны, такие как
INT_MIN
...INT_MAX
и другие минимальные / максимальные значения из стандарта, при выборе целочисленных типов, и не рекомендует полагаться на размеры, так как есть другие тонкие факторы, которые могут быть забыты, такие какCHAR_BIT
биты заполнения, которые может повлиять на значениеsizeof (int)
(то есть распространенные заблуждения о двухбайтовых и четырехбайтовых целых числах игнорируют эти детали).источник
C99 N1256 стандартная тяга
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
Размер
int
и все другие целочисленные типы определяются реализацией, C99 определяет только:5.2.4.2.1 «Размеры целочисленных типов
<limits.h>
» дает минимальные размеры:6.2.5 «Типы» затем говорит:
и 6.3.1.1 «Булевы, символы и целые числа» определяют относительные ранги преобразования:
источник
Единственные гарантии , что
char
должно быть по крайней мере , 8 битов в ширину,short
иint
должны быть по крайней мере , 16 бит, иlong
должно быть по крайней мере , 32 бита, а также, чтоsizeof (char)
<=sizeof (short)
<=sizeof (int)
<=sizeof (long)
( То же самое справедливо и для беззнаковых версий этих типов ).int
может иметь ширину от 16 до 64 бит в зависимости от платформы.источник
Ответ «да» / «нет» / «возможно» / «возможно нет».
Язык программирования C определяет следующее: наименьшая адресуемая единица, известная
char
и называемая также «байтом» , имеетCHAR_BIT
ширину ровно в битах, гдеCHAR_BIT
не менее 8.Таким образом, один байт в C не обязательно является октетом , то есть 8 битами. В прошлом одна из первых платформ для запуска кода на C (и Unix) имела 4 байта,
int
но в общей сложностиint
имела 36 бит, потому чтоCHAR_BIT
была 9!int
Предполагается, что это натуральный целочисленный размер для платформы, которая имеет диапазон не менее-32767 ... 32767
. Вы можете получить размерint
в байтах платформы с помощьюsizeof(int)
; когда вы умножите это значение,CHAR_BIT
вы узнаете, насколько оно шире в битах.Хотя 36-битные машины в основном не работают, все еще существуют платформы с не 8-битными байтами. Буквально вчера возник вопрос о микроконтроллере Texas Instruments с 16-битными байтами , который имеет C99, C11-совместимый компилятор.
На TMS320C28x , кажется , что
char
,short
иint
есть все 16 бит, и , следовательно , один байт.long int
2 байта иlong long int
4 байта. Прелесть C в том, что можно написать эффективную программу для такой платформы и даже сделать ее переносимым способом!источник
В основном это зависит от платформы, которую вы используете. Это зависит от компилятора до компилятора. В настоящее время в большинстве компиляторов int составляет 4 байта . Если вы хотите проверить, что использует ваш компилятор, вы можете использовать
sizeof(int)
.Единственное, что обещает компилятор c, это то, что размер short должен быть равен или меньше, чем int, а размер long должен быть равен или больше, чем int. Так что, если размер int равен 4, то размер short может быть 2 или 4, но не больше. чем это. То же самое верно для долго и инт. Это также говорит о том, что размер короткого и длинного не может быть одинаковым.
источник
%d
дляsize_t
параметра UB.Это зависит от реализации, но обычно от x86 и других популярных архитектур, таких как ARM,
int
занимает 4 байта. Вы всегда можете проверить во время компиляции, используяsizeof(int)
любой другой тип, который вы хотите проверить.Если вы хотите убедиться, что вы используете тип определенного размера, используйте типы в
<stdint.h>
источник
Это возвращает 4, но это, вероятно, зависит от машины.
источник
C позволяет «байты» быть чем-то отличным от 8 бит на «байт».
Значение, превышающее 8, становится все более редким. Для максимальной переносимости используйте,
CHAR_BIT
а не 8. Размерint
в битах в C равенsizeof(int) * CHAR_BIT
.Размер
int
бита обычно составляет 32 или 16 бит. C указанными минимальными диапазонами :Минимальный диапазон для
int
сил битого размера , чтобы быть по крайней мере , 16 - даже если процессор был «8-бит». Размер как 64 бита замечен в специализированных процессорах. Другие значения, такие как 18, 24, 36 и т. Д., Встречались на исторических платформах или, по крайней мере, теоретически возможны. Современное кодирование редко беспокоитint
размер не -2- битных битов.Процессор и архитектура компьютера определяют
int
выбор размера бит.Тем не менее, даже с 64-разрядными процессорами
int
размер компилятора может быть 32-разрядным из соображений совместимости, поскольку большие базы кода зависят отint
32-разрядного (или 32/16).источник
Это хороший источник для ответа на этот вопрос.
Но этот вопрос является своего рода всегда правдой и отвечает: «Да. Оба».
Это зависит от вашей архитектуры. Если вы собираетесь работать на 16-битной машине или меньше, она не может быть 4 байта (= 32 бит). Если вы работаете на 32-битной машине или лучше, ее длина 32-битная.
Чтобы выяснить, подготовьте ли вы программу для вывода чего-то читаемого и используйте функцию «sizeof». Это возвращает размер в байтах вашего объявленного типа данных. Но будьте осторожны, используя это с массивами.
Если вы объявляете,
int t[12];
он вернет 12 * 4 байта. Чтобы получить длину этого массива, просто используйтеsizeof(t)/sizeof(t[0])
. Если вы собираетесь создать функцию, которая должна рассчитывать размер отправляемого массива, помните, что еслиТак что это даже не вернет что-то другое. Если вы определили массив и попытаетесь впоследствии получить длину, используйте sizeof. Если вы отправляете массив в функцию, помните, что значение send это просто указатель на первый элемент. Но в первом случае вы всегда знаете, какой размер имеет ваш массив. Случай два можно выяснить, определив две функции и упустив некоторые характеристики. Определите функцию (массив t) и определите function2 (массив t, int size_of_t). Вызовите «function (t)», чтобы измерить длину некоторой копировальной работой и отправьте результат в function2, где вы можете делать что угодно с переменными размерами массива.
источник
char
, всегдаsigned
)