Представлення чисел зі знаком
У інформатиці використовують різні способи представлення чисел зі знаком у двійковій системі числення.
У математиці, від'ємні числа в системі числення з будь-якою основою позначаються за допомогою знака мінус («-») перед ними. Проте, в комп'ютерній техніці, числа представляються лише у вигляді послідовності бітів, без додаткових символів. Існує чотири найвідоміших методи розширення двійкової системи числення для представлення чисел зі знаком:
- прямий код,
- обернений код,
- доповняльний код,
- двійковий зсув.
Деякі альтернативні методи замість явного використання знаку, використовують його неявно, наприклад, можна використовувати систему числення з основою −2. Відповідні способи представлення чисел можуть бути розроблені для будь-яких інших основ, чи додатних, від'ємних, дробових, чи інших розробок на цю тему.
Не існує критеріїв, щоб з'ясувати який метод найкращий. У більшості сучасних обчислювальних пристроїв використовується доповняльний код, існують і такі, які використовують обернений код.
Прямий код
Цей метод ще називають «знак та величина» (англ. sign and magnitude), а про числа записані в такому вигляді кажуть «знакова величина». В першому наближені, задача представлення знака числа зводиться до виділення додаткового знакового біту, який відповідає знаку числа: значення цього біту (зазвичай це старший біт) дорівнює 0 для додатного числа і 1 для від'ємного. Решта бітів числа позначають величину числа (або абсолютне значення). Тому в байті лише 7 біт (знаковий біт відокремлено) буде використано для позначення величини, яка змінюється від 0000000 (0) до 1111111 (127). Таким чином, можна представляти числа від −12710 до +12710 якщо додавати знаковий (восьмий) біт. Як наслідок, існує два способи представлення нуля, а саме 00000000 (0) та 10000000 (−0). Для прикладу, −4310 у 8-бітномі кодуванні буде 10101011.
Цей підхід цілком відповідає загальному способу вказувати знак (розміщувати знак «+» або «−» перед величиною цього числа). Деякі ранні бінарні комп'ютери (наприклад, IBM 7090) використовували таке представлення, скоріш за все, у відповідності до загальноприйнятого способу. Прямий код є найбільш поширеним способом представлення чисел з рухомою комою.
Порівняльна таблиця
У наступній таблиці показані додатні та від'ємні цілі числа, які можуть бути представлені за допомогою 4 біт.
| Десяткове | Беззнакове | Прямий код | Обернений код | Доповняльний код | Двійковий зсув | Основа −2 |
|---|---|---|---|---|---|---|
| +16 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| +15 | 1111 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| +14 | 1110 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| +13 | 1101 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| +12 | 1100 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| +11 | 1011 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| +10 | 1010 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| +9 | 1001 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| +8 | 1000 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
| +7 | 0111 | 0111 | 0111 | 0111 | 1111 | Н/Д |
| +6 | 0110 | 0110 | 0110 | 0110 | 1110 | Н/Д |
| +5 | 0101 | 0101 | 0101 | 0101 | 1101 | 0101 |
| +4 | 0100 | 0100 | 0100 | 0100 | 1100 | 0100 |
| +3 | 0011 | 0011 | 0011 | 0011 | 1011 | 0111 |
| +2 | 0010 | 0010 | 0010 | 0010 | 1010 | 0110 |
| +1 | 0001 | 0001 | 0001 | 0001 | 1001 | 0001 |
| +0 | 0000 | 0000 | 0000 | 0000 | 1000 | 0000 |
| −0 | 1000 | 1111 | ||||
| −1 | Н/Д | 1001 | 1110 | 1111 | 0111 | 0011 |
| −2 | Н/Д | 1010 | 1101 | 1110 | 0110 | 0010 |
| −3 | Н/Д | 1011 | 1100 | 1101 | 0101 | 1101 |
| −4 | Н/Д | 1100 | 1011 | 1100 | 0100 | 1100 |
| −5 | Н/Д | 1101 | 1010 | 1011 | 0011 | 1111 |
| −6 | Н/Д | 1110 | 1001 | 1010 | 0010 | 1110 |
| −7 | Н/Д | 1111 | 1000 | 1001 | 0001 | 1001 |
| −8 | Н/Д | Н/Д | Н/Д | 1000 | 0000 | 1000 |
| −9 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | 1011 |
| −10 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | 1010 |
| −11 | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д | Н/Д |
Зворотня таблиця, в якій послідовності з 4-х бітів ставиться у відповідність числа, в залежності від способу представлення:
| Бінарне | Беззнакове | Прямий код | Обернений код | Доповняльний код | Двійковий зсув | Основа −2 |
|---|---|---|---|---|---|---|
| 0000 | 0 | 0 | 0 | 0 | −8 | 0 |
| 0001 | 1 | 1 | 1 | 1 | −7 | 1 |
| 0010 | 2 | 2 | 2 | 2 | −6 | −2 |
| 0011 | 3 | 3 | 3 | 3 | −5 | −1 |
| 0100 | 4 | 4 | 4 | 4 | −4 | 4 |
| 0101 | 5 | 5 | 5 | 5 | −3 | 5 |
| 0110 | 6 | 6 | 6 | 6 | −2 | 2 |
| 0111 | 7 | 7 | 7 | 7 | −1 | 3 |
| 1000 | 8 | −0 | −7 | −8 | 0 | −8 |
| 1001 | 9 | −1 | −6 | −7 | 1 | −7 |
| 1010 | 10 | −2 | −5 | −6 | 2 | −10 |
| 1011 | 11 | −3 | −4 | −5 | 3 | −9 |
| 1100 | 12 | −4 | −3 | −4 | 4 | −4 |
| 1101 | 13 | −5 | −2 | −3 | 5 | −3 |
| 1110 | 14 | −6 | −1 | −2 | 6 | −6 |
| 1111 | 15 | −7 | −0 | −1 | 7 | −5 |
Джерела
- Ivan Flores, The Logic of Computer Arithmetic, Prentice-Hall (1963)
- Israel Koren, Computer Arithmetic Algorithms, A.K. Peters (2002), ISBN 1-56881-160-8