Чи займає змінна Integer в C 2 байти або 4 байти?
Це залежить від платформи, яку ви використовуєте, а також від налаштування компілятора. Єдина авторитетна відповідь - використовувати sizeof
оператор, щоб побачити, наскільки велике ціле число у вашій конкретній ситуації.
Від яких факторів це залежить?
Діапазон, можливо, найкраще розглядати, а не розмір . І те й інше буде відрізнятись на практиці, хоча набагато більш дурним є вибір змінних типів за діапазоном, ніж розмір, як ми побачимо. Важливо також зазначити, що стандарт спонукає нас розглянути вибір цілих типів на основі діапазону, а не розміру , але поки що ігноруємо стандартну практику , і дозвольмо нашій цікавості вивчити sizeof
, байти CHAR_BIT
та ціле представлення ... давайте поринемо кроляча нора і переконаємося в цьому ...
sizeof
, байти та CHAR_BIT
Наступне твердження, взяте зі стандарту С (пов'язане з вище), описує це словами, які, на мою думку, не можуть бути покращені.
sizeof
Оператор дає розмір (в байтах) свого операнда, який може бути вираз в дужках або ім'я типу. Розмір визначається від типу операнду.
Якщо припустити чітке розуміння, це призведе нас до дискусії про байти . Зазвичай прийнято вважати, що байт - це вісім біт, коли насправді CHAR_BIT
говорить про те, скільки бітів у байті . Це лише один з тих нюансів, який не враховується, коли йдеться про загальні два (або чотири) байтові цілі числа .
Давайте закінчимо речі поки що:
sizeof
=> розмір у байтах та
CHAR_BIT
=> кількість бітів у байтах
Таким чином, залежно від вашої системи sizeof (unsigned int)
може бути будь-яке значення, що перевищує нуль (не лише 2 або 4), як якщо б CHAR_BIT
це 16, то в одному (шістнадцять бітовому) байті є достатньо бітів у ньому, щоб представляти шістнадцять бітових цілих чисел, описаних стандарти (цитується нижче). Це не обов'язково корисна інформація, чи не так? Давайте поглибимося глибше ...
Представлення цілого числа
Стандарт C визначає мінімальну точність / діапазон для всіх стандартних цілих типів (і CHAR_BIT
, також, fwiw) тут . Виходячи з цього, ми можемо отримати мінімум для того, скільки бітів потрібно для зберігання значення , але ми можемо просто вибрати наші змінні на основі діапазонів . Тим не менш, величезна частина деталей, необхідних для цієї відповіді, знаходиться тут. Наприклад, наступне, що стандарт unsigned int
вимагає (принаймні) шістнадцяти біт зберігання:
UINT_MAX 65535 // 2¹⁶ - 1
Таким чином, ми можемо бачити, що unsigned int
потрібно ( принаймні ) 16 біт , саме там ви отримуєте два байти (якщо вважати, що CHAR_BIT
це 8) ... і пізніше, коли ця межа зросла до 2³² - 1
, люди замість цього заявляли 4 байти. Це пояснює явища, які ви спостерігали:
Більшість підручників кажуть, що цілі змінні займають 2 байти. Але коли я запускаю програму, друкуючи послідовні адреси масиву цілих чисел, вона показує різницю в 4.
Ви використовуєте стародавній підручник та компілятор, який навчає вас портативному C; автор, який написав ваш підручник, може навіть не усвідомлювати CHAR_BIT
. Вам слід оновити підручник (і компілятор) і прагнути пам’ятати, що ІТ - це постійно розвивається сфера, яку вам потрібно випереджати, щоб конкурувати… Хоча про це хоч і; давайте подивимося, які ще непереносимі секрети зберігаються в основі цілих цілих байтів ...
Біти цінності - це те, що, як видається, вважають поширеними помилками. У наведеному вище прикладі використовується unsigned
цілий тип, який, як правило, містить лише біти значення, тому диявола легко пропустити в деталях.
Підпишіть біти ... У наведеному вище прикладі я наводив UINT_MAX
верхню межу, unsigned int
оскільки це тривіальний приклад для отримання значення 16
з коментаря. Для підписаних типів, щоб розрізняти позитивні та негативні значення (це знак), нам також потрібно включити біт знаків.
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
Біт прокладки ... Хоча не часто зустрічаються комп’ютери, які мають цілі біти в цілих числах, стандарт C дозволяє це робити; деякі машини (тобто ця ) реалізують великі цілі типи, комбінуючи два менших (підписаних) цілих числа разом ... і коли ви поєднаєте підписані цілі числа, ви отримаєте марно розрядний знак. Цей витрачений біт вважається забиттям у C. Інші приклади бітів оббивки можуть включати біти парності та біти ловушки .
Як бачимо, стандарт здається, що він заохочує враховувати діапазони на зразок INT_MIN
.. INT_MAX
та інші мінімальні / максимальні значення від стандарту при виборі цілих чисел, і не відштовхується від розміру, оскільки існують й інші найтонші фактори, які, можливо, будуть забуті, такі як CHAR_BIT
біт підкладки, який може вплинути на значення sizeof (int)
(тобто загальні помилкові уявлення про двобайтові та чотирибайтні цілі числа нехтують цими деталями).