При алгебраїчному додаванні двох чисел, що містяться в розрядній сітці, може виникнути переповнення, тобто утворитися сума, що вимагає для свого зображення на один цифровий розряд більше порівняно з розрядною сіткою доданків. Сформулюємо правило (ознаку) для виявлення переповнення розрядної сітки.
При алгебраїчному додаванні двох двійкових чисел з використанням додаткового (зворотного) коду для їхнього зображення ознакою переповнення розрядної сітки є перенесення в знаковий розряд суми за відсутності перенесення з нього (додатне переповнення). Ознакою від ' ємного переповнення є перенесення зі знакового розряду суми за відсутності перенесення в нього.
Якщо й у знаковий, і зі знакового розряду суми є чи немає перенесення, то переповнення відсутнє. При додатному переповненні результат операції додатний, при від'ємному – від'ємний. Розглянемо додатне та від'ємне переповнення:
а) б)
0 101 1 011
+ +
0 1011 011
1 010 10110.
Приклад а) демонструє додатне переповнення, б) – від'ємне.
|
|
Зображення цілих чисел
Пригадаємо, що в мові C існує базовий тип int для зображення цілих чисел зі знаком. Також для цього можна використати модифікатори short та long і отримати типи short int чи просто short та long int, скорочено – long, а також unsigned для зображення беззнакових цілих (утворюються типи unsigned int, unsigned short int та unsigned long int). Для роботи з цілими числами, для зображення яких достатньо одного байта, можна використовувати й типи char чи unsigned char.
У пам'яті комп'ютера дані зберігаються в послідовно розташованих байтах. Для даних різних типів використовується різна кількість байтів (табл. 5.3).
Таблиця 5.3
Повна назва типу | Скорочена назва типу | Обсяг у байтах | Діапазон значень |
Signed char | Char | Від –128 до 127 | |
Signed int | Signed,int | ~ | |
Signed short in | Short, Signed short | від –32 768 до 32 767 | |
Signed long int | Long, Signed long | від –2 147 483 648 до 2 147 483 647 | |
Unsigned char | Unsigned char | Від 0 до 255 | |
Unsigned short int | Unsigned short | Від 0 до 65 535 | |
Unsigned long int | Unsigned long | Від 0 до 65 535 | |
Unsigned int | Unsigned | ~ | від 0 до 4 294 967 295 |
~ – розмір залежить від типу комп'ютера |
Обсяг пам'яті для даних типу int, unsigned int визначається довжиною машинного слова, різною для різних комп'ютерів. Для 16-розрядних обсяг машинного слова становить 2, для 32-розрядних – 4 байти.
Ми бачимо, що діапазон можливих значень цілих типів істотно залежить від кількості байтів, необхідних для внутрішнього зображення.
За загальноприйнятими правилами, при зображенні чисел зі знаком крайній лівий біт старшого байта 0 використовується для зображення знака плюс і 1 – для мінуса.
Легко бачити, що при цьому найменшим від'ємним числом, що належить типу char, є число –128 – двійкове зображення 10000000, а найбільшим – число 127 (зображення 01111111). Зверніть увагу: якщо до числа 01111111 додати одиницю, то вийде 10000000, що означає: 127 + 1 = –128. Отже, множину елементів типу char можна зобразити у вигляді згорнутого в кільце відрізка [–128; 127].
|
|
Для елементів множини цілих чисел, що зображується типом char, не виконується властивість цілих чисел . Нерозуміння цього факту може призвести до вкрай неприємних наслідків.
Розглянемо машинні значення діапазону цілих типів (табл. 5.4).
Таблиця 5.4
Тип | Діапазон значень | Машинне зображення |
Char | –128...127 | 10000000 … |
Short int | –32768...32767 | 00000000 10000000 … 11111111 01111111 |
long int | –2147483648...2147483647 | 00000000 00000000 00000000 10000000… 11111111 11111111 11111111 01111111 |
Unsigned char | 0…255 | 00000000 … |
Unsigned short int | 0…65535 | 00000000 00000000 … 11111111 11111111 |
Unsigned long int | 0 … 4 294 967 295 | 00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111 |