Skip to main content
LibreTexts - Ukrayinska

4.2: Змінні розміри

  • Page ID
    29709
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)

    Поширеним питанням серед нових програмістів є «Чому існує так багато розмірів змінних?» У нас є два різних розмірів реалів; плавати на 32 біт, і подвійний на 64 біт. У нас також є три різних 4 розміри цілих чисел на 8, 16 і 32 біт кожен 1. У багатьох мовах, є просто реальне і ціле число без зміни розміру, так чому C пропонує так багато варіантів? Причина в тому, що «один розмір не підходить всім». У вас є варіанти для того, щоб оптимізувати свій код. Якщо у вас є змінна, яка варіюється від скажімо, 0 до 1000, немає необхідності використовувати більше, ніж короткий (16 біт) ціле число. Використання 32-бітного цілого числа просто використовує більше пам'яті. Тепер ви можете вважати 2 зайвих байтів не є великою справою, але пам'ятайте, що ми говоримо про вбудовані контролери в деяких випадках, а не настільних систем. Деякі невеликі контролери можуть мати лише кілька сотень байт пам'яті, доступної для даних. Навіть на настільних системах з гігабайтами пам'яті вибір неправильного розміру може виявитися згубним. Наприклад, припустимо, у вас є система з аналого-цифровим перетворювачем для аудіо. Стандартна частота дискретизації CD становить 44,100 зразків в секунду. Кожен зразок є 16-бітовим значенням (2 байта), що дає швидкість передачі даних 88 100 байт в секунду. А тепер уявіть, що вам потрібно достатньо пам'яті для п'ятихвилинної пісні в стерео. Це працює майже до 53 мегабайт пам'яті. Якби ви вибрали довгі (32-бітові) цілі числа для зберігання цих даних, замість цього вам знадобиться близько 106 мегабайт. Оскільки значення, розміщені на звуковому компакт-диску, ніколи не перевищують 16 біт, було б нерозумно виділяти більше 16 біт кожен для значень. Розміри даних є потужністю-2 кратні байту, хоча, так що ви не можете вибрати, щоб мати ціле число скажімо, 22 біт довжини. Це 8, 16 або 32 здебільшого (деякі контролери мають верхню межу 16 біт).

    У випадку з поплавком проти подвійного, поплавок використовується там, де простір є премією. Він має менший діапазон (розмір показника) і меншу точність (кількість значущих цифр), ніж подвійний. double, як правило, є кращим і є нормою для більшості математичних функцій. Звичайні поплавці іноді називають одинарними (тобто одинарна точність проти подвійної точності).

    Якщо ви не знаєте розмір певного елемента даних (наприклад, int може бути або 16 або 32 біт залежно від обладнання та компілятора), ви можете скористатися командою sizeof (). Це виглядає як функція, але вона дійсно вбудована в мову. Аргументом є елемент або вираз, який вас цікавить. Він повертає необхідний розмір у байтах.

    size = sizeof( int );
    

    розмір буде або 2, або 4 в залежності від системи.


    1. У деяких системах також доступні 80 бітових дублів та/або 64 бітових цілих чисел.