Поговорими про типи. Частина 2.

Опубліковано: 2008-12-14   12:21:21

C/C++Вже давно настав час, для продовження моїх уроків що до мови С. Минулого разу я дав загальну інформацію щодо типів в мови С та пообіцяв детальніше розповісти про цілі типи.

Невеличкий екскурс в способи виведення даних з програми

Зрозуміло, що більшість програм орієнтовані на роботу з користувачем. І перше, що вони мусять робити - віддати у зручному вигляді інформацію. В першій програмі, яку я писав для прикладу було використано функцію puts, яка здатна вивести в стандартний контекст виведення рядкову константу

Переходячи до роботи з типізованими даними мусимо якимось чином виводити дані іншого формату. Звичайно ж мова C надає такі можливості. В стандартній бібліотеці stdio для цього присутня функція printf. Для того, щоб роздрукувати ціле число в консоль за допомогою цієї функції достатньо рядка коду:

printf("%i", 10);

Цей рядок надрукує в консолі число 10. Ця функція першим параметром має містити рядок-формат виведення. Функція відправить цей рядок у стандартний контекст виведення (в звичайному випадку на екран), замінивши формати на відповідні параметри функції. Наприклад,

printf("%ith article in my blog", 25);

надрукає в консолі рядок: "25th article in my blog". Поки наведу ті формати, що стосуються цілих типів. Це %d та %i(що є синонімами для виведення), а також %ui - беззнакове десяткове ціле число.

Цілі числові типи

Як виводити цілі числа в консоль ми вже розібрались. Настав час розібратись з самими цілими типами. Всього їх можна налічити 3: short, int та long. Взагалі то short та long зпочатку були в ролі додатків перед int (short int, long int), однак тепер вважаються повноцінними типами. Чим же вони відрізняються? Дозвольте різницю проілюструвати прикладом:

#include "stdio.h" int main() { printf("%i %i %i\n", sizeof(short), sizeof(int), sizeof(long)); }

sizeof - результатом виконання повертає розмір, який елемент займає у пам'яті. Ця невеличка програма має надрукувати на екрані об'єми пам'яті, що займають різні цілі типи. Я отримав такий результат: 2 4 4. Раніше long був подвоєним int за розміром, однак можна помітити, що тепер це не зовсім так. Десь читав, що такі зміни пов'язані з появою 64-розрядних процесорів.

Що дає різниця в необхідному об'ємі пам'яті? Дозволю собі невеличку розповідь. В пам'яті комп'ютера інформація зберігається у вигляді послідовностей електричних імпульсів та їх відсутності. Для зручності наявність імпульсу позначається 1, а відсутність 0. Кожен байт складається з 8 біт, тобто тих самих "очікуваних імпульсів". Якщо один біт може закодувати два числа 0 та 1, то два біти своїми комбінаціями можуть задати 4 числа: 0, 1, 2, 3. Отже можемо створити таку таблицю:

Назва типуОб'єм пам'яті, байт Діапазон значень
short2-32768...+32767
int4-2147483648...+2147483647
long4 -2147483648...+2147483647

Ще деякі данні про зберігання цілих змінних в пам'яті та unsigned

Я вже казав. що число в пам'яті зберігається як набір з бітів. Причому біти прийнято записувати з ліва на право, що ж досить звичним. Однак я не сказав нічого про знак, який приймає змінна, а як можна помітити з таблички всі типи мають як додатні так і від'ємні значення. За знак замінної відповідає перший зліва біт в пам'яті. За замовчуванням його встановлено в 0, що відповідає +.

Зрозуміло, що не завжди необхідними є від'ємні значення. І мова С не могла б вважатись ефективною, якби не мала можливостей виключити втрати пам'яті пов'язані з необхідністю зберігання знаку. Якщо змінну декларувати як:

unsigned short i;

, то біт, який використовувався для зберігання знаку, буде використовуватись як ще один біт що впливає на значення, тобто область значень для змінною зміниться на 0..65535. Отже можна зберегти більший обсяг даних без необхідності змінювати тип змінної.

Допустимі операції

Настав час перейти до практичного використання знань. А саме для вивчення операцій, що можуть виконуватись з цілими числами в мові С. Є п'ять-шість основних операцій:

  1. додавання (+)
  2. віднімання (-)
  3. множення (*)
  4. цілочислене ділення (/)
  5. залишок від ділення (%)
  6. присвоєння (=)

Гадаю, що всі ці операції знайомі зі шкільної лави будь-кому. Дозволю собі нагадати, що минулого разу нам вже довелось зіштовхнутись з операцією присвоєння "=". З точки зору комп'ютера, оператор присвоєння за місцем в пам'яті, яке відповідає ідентифікатору, що знаходиться зліва від оператора, кладе результат виконання дій з права. Наприклад,

short a = 10, b = 3, c; c = a%b;

означає, що в місце пам'яті відведене під змінну c буде покладене значення, що є залишком від ділення значення, що знаходиться в пам'яті за адресою зв'язаною з ідентифікатором a на значення, що знаходиться в пам'яті за адресою зв'язаною з ідентиікатором b. В нашому випадку змінна c матиме значення 1.

Для прискорення виконання та спрощення запису операцій вигляду

a = a + b;

(тобто коли результатом є перший з операндів) та аналогічних з відніманням, множенням і т.д. присутні оператори +=, -=, /=, *=, %=. Також є операції інкременту, та дикременту: ++ та --, що відповідно збільшують зменшують значення змінної на 1.

Трошки математики

Пропоную Вам в якості простенького домашнього завдання написати дві-три програми, що б виконували розрахунки з формул з цілими числами з даними, що зберігаються в самій програмі. Для цього Вам стануть в нагоді оператори зміни пріорітету операцій, тобто "(", ")". Все як в звичайній математиці :)

Невеличке домашнє завдання Ви отримали. Гадаю, що на сьогодні вже досить багато матеріалу. Наступного разу планую розповісти про дійсні типи. Слідкуйте через rss та поштову розсилку, залишайте відгуки в коментарях та мені на пошту grandse(at)ukr.net. Дякую за увагу!

Коментарі: 0
 

Коментарі:

Додати коментар

user

email

url

text

Повідомляти про новікоментарі