Як зберігаються негативні підписані значення?


13

Я переглядав це відео про максимальні та мінімальні значення підписаних цілих чисел.

Візьмемо приклад позитивного підписаного значення - 0000 0001 Перший біт позначає, що число є позитивним, а останні 7 біт - самим числом. Тож це легко інтерпретується як +1.

Тепер візьмемо приклад негативного підписаного значення - 1000 0000, яке виявляється рівним -8. Гаразд, комп’ютер може зрозуміти, що це негативне значення через перший біт, але як, до біса, він розуміє, що 000 0000 означає -8?

Як правило, як негативні підписані значення зберігаються / інтерпретуються на комп'ютері?


nl.wikipedia.org/wiki/Two%27s_complement - це те, як двійкове число зберігається на комп'ютерах.
Пітер Б

@PieterB Можливо, ваш комп'ютер. І багато інших людей. З вагомих причин! Але не майте на увазі, що це єдиний спосіб.
підкреслюю_d

Як завгодно. Я можу придумати щонайменше 256! способи зберігання (8 бітових) двійкових чисел на комп’ютерах. Однак більшість із них неймовірно нерозумні.
Калет

C не вказує, багато в чому виробник чіпів вирішує представляти дані. C збирається до машинного коду, і він дбає про те, щоб не переосмислювати, як чіп зберігає номери. Ті ж правила застосовуються і до чисел з плаваючою комою. Виробник чіпів визначає, як вони зберігаються. Більшість виробників чіпів використовують додаток 2, але я впевнений, що є винятки.
Берін Лорич

Відповіді:


29

Стандарт C не передбачає конкретного способу представлення негативних підписаних номерів.

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

Доповнення двох з N-бітового числа xвизначається як 2^N - x. Наприклад, 8-бітним доповненням двох 1є 2^8 - 1, або 1111 1111. 8-бітовим доповненням двох 8є 2^8 - 8, що в двійковому є 1111 1000. Це також можна обчислити, перегортаючи біти xта додаючи один. Наприклад:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

Доповнення N-бітового числа x визначається як x з усіма його бітами в основному.

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

Доповнення двох мають ряд переваг перед доповненням одного. Наприклад, у нього відсутнє поняття «негативний нуль», яке з поважних причин бентежить для багатьох людей. Додавання, множення і віднімання працюють однаково з підписаними цілими числами, реалізованими з двома доповненими, як і з непідписаними цілими числами.


19

Існують три добре відомі методи представлення від'ємних значень у двійковій формі:

  1. Підписана величина . Це найпростіше зрозуміти, оскільки він працює так само, як ми звикли, коли ми маємо справу з негативними десятковими значеннями: Перша позиція (біт) являє собою знак (0 для додатного, 1 для негативного), а інші біти представляють число . Хоча нам це легко зрозуміти, з комп’ютерами важко працювати, особливо при виконанні арифметики з від’ємними числами.
    У 8-бітовій підписаній величині значення 8 представлено як 0 0001000 і -8 як 1 0001000.

  2. Доповнення . У цьому поданні негативні числа створюються з відповідного додатного числа шляхом перегортання всіх бітів, а не лише біта знака. Це полегшує роботу з від’ємними числами для комп’ютера, але має складність у тому, що існують два різних подання для +0 та -0. Перегортання всіх шматочків робить це важче зрозуміти для людини.
    У 8-бітовому додатку значення 8 представлено як 00001000, а -8 як 11110111.

  3. Доповнення двох . Це найпоширеніше уявлення, яке в даний час використовується для від'ємних цілих чисел, оскільки з ним найпростіше працювати за комп'ютерами, але це також важче зрозуміти людині. Порівнюючи бітові шаблони, використані для негативних значень між доповненням одного та двома доповненнями, можна помітити, що однаковий бітовий зразок у двох комплементах комплементу кодує для наступного нижнього числа. Наприклад, 11111111 означає -0 у доповненні до одного, а для -1 у доповненні двох і аналогічно 10000000 (-127 проти -128).
    У 8-бітовому додатку значення 8 представлено як 00001000, а -8 як 11111000.


8
Підписана величина також має два нулі.
Йорг W Міттаг

+1 для згадування знаку / величини. нечасто і незручно (для процесорів, якщо не для людей!), але варто знати.
підкреслюю_d

Майже всі ми працюємо з підписаною величиною, особливо з номерами FP.
Пауло1205

2

Підписані цілі числа зберігаються за допомогою http://en.wikipedia.org/wiki/Two%27s%20complement

Тоді ви отримуєте:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

В основному підрахунок дуже простий, ви рахуєте до половини максимуму підписаного цілого числа. Зробіть +1, зробіть це негативним і почніть відлік.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.