Чому для підписаних номерів віддавати перевагу двом доповненням над знаком та величиною?


201

Мені просто цікаво, чи є причина, чому для представлення -1 у двійковій формі використовується доповнення двох: гортання бітів та додавання 1?

-1 представлено 11111111 (доповнення двох), а не (мені інтуїтивніше) 10000001, що є двійковим 1 з першим бітом як негативний прапор.

Відмова: Я не покладаюся на бінарну арифметику для своєї роботи!


6
FWIW, ваш "інтуїтивний" метод використання знака бітів використовується випадково - наприклад, більшість комп'ютерів використовують біт знаків, коли представляють числа з плаваючою комою.
Адісак

2
@Adisak Це називається підписаною величиною
Коул Джонсон

2
Я завжди пов'язував подання знаків і величин з цілими числами, оскільки номери з плаваючою точкою містять три компоненти: знак, показник та мантісу (часто із неявним «1»). Але я здогадуюсь, що досить просто лікувати експонент і мантісу настільки великі, доки людина зрозуміє, що вони не є суворо лінійними.
Адісак

Ось стаття, що розповідає про те, як числа з плаваючою комою зберігаються у двійковій формі для тих, хто цікавиться зауваженнями @ Адісака.
ВВП2

Щойно побачив приємне відео, що пояснює це youtube.com/watch?v=dHB7jFjESLY
allenlinli

Відповіді:


333

Робиться так, що для додавання не потрібно мати особливої ​​логіки поводження з негативними числами. Перегляньте статтю у Вікіпедії .

Скажіть, у вас є два числа, 2 і -1. У вашому "інтуїтивному" способі представлення чисел вони будуть 0010і 1001відповідно (я дотримуюся 4 біт за розміром). У додатковому коді чином, вони є 0010і 1111. Тепер, скажімо, я хочу їх додати.

Доповнення двох доповнень дуже просте. Ви додаєте номери зазвичай, і будь-який біт перенесення відкидається. Тож вони додаються наступним чином:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 дорівнює 1, що є очікуваним результатом "2 + (- 1)".

Але у вашому "інтуїтивно зрозумілому" методі додавання складніше:

  0010
+ 1001
= 1011

Який -3, правда? Просте додавання в цьому випадку не працює. Потрібно зауважити, що одне з чисел є негативним, і використовувати інший алгоритм, якщо це так.

Для цього "інтуїтивного" способу зберігання віднімання - це інша операція, ніж додавання, що вимагає додаткових перевірок чисел, перш ніж вони можуть бути додані. Оскільки ви хочете, щоб найбільш основні операції (додавання, віднімання тощо) проходили якомога швидше, вам потрібно зберігати числа таким чином, щоб ви могли використовувати найпростіші можливі алгоритми.

Крім того, в "інтуїтивно зрозумілому" способі зберігання є два нулі:

0000  "zero"
1000  "negative zero"

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

Є ще один бонус із збереженням ints таким чином, і саме тоді вам потрібно збільшити ширину регістра, в якому зберігається значення. З доповненням двох, зберігання 4-бітового числа в 8-бітовому регістрі - справа повторення його найзначніший біт:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

Справа лише в тому, щоб подивитися на знаковий штрих меншого слова і повторити його, поки він не накреслить ширину великого слова.

За допомогою вашого методу вам потрібно буде очистити існуючий біт, який є додатковою операцією на додаток до прокладки:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Вам потрібно встановити ці додаткові 4 біти в обох випадках, але в "інтуїтивному" випадку вам також потрібно очистити 5-й біт. Це один крихітний додатковий крок у одній із найважливіших та найпоширеніших операцій, присутній у кожній програмі.


13
Я згоден. 2 доповнення працює. Але як ми дійшли до цього в першу чергу? Якщо припустимо, що мені потрібно прийти до цього позначення, яким би був процес думки. Я думаю, що прийти до доповнення 2 має бути більше, ніж просто удача, чи не так?
Лазер

1
Крім того, чому немає 2-х додатків для поплавців?
Лазер

6
@Lazer Перевірте цю статтю, щоб знати how we arrived at 2s compliment the first place. cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
Ankit

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

3
@Suraj, я пропоную переглянути статтю у Вікіпедії у додатку двох для повної відповіді: en.wikipedia.org/wiki/Two%27s_complement . Коротка відповідь СЗБ 1показує -8, а решта три 1s вказують 4, 2і 1, відповідно, так -8+4+2+1 = -1.
Вельбог

18

У Вікіпедії все сказано:

Система доповнення двох має перевагу в тому, що не вимагає, щоб схема додавання і віднімання досліджувала ознаки операндів, щоб визначити, додавати чи віднімати. Ця властивість робить систему як простішою у застосуванні, так і здатною легко керувати арифметикою більш високої точності. Також нуль має лише одне представлення, усуваючи тонкощі, пов'язані з негативним нулем, що існує в системах доповнення.

Іншими словами, додавання - це те саме, чим сильніше, чи ні, число негативне.


Сер, якщо я напишу char a = 12; і непідписаний char b = 12, чи є базовим біт-скором однаковий, що насправді відбувається?
Сурай Джайн

Нічого не змінюється, коли пише чи читає. Застосовується лише при додаванні чи відніманні.
Talespin_Kit

12

Хоча це питання давнє, дозвольте мені поставити свої 2 копійки.

Перш ніж я поясню це, повернемося до основ. 2 'доповнення - це доповнення 1 + 1. Тепер, що є доповненням 1, і яке його значення на додачу.

Сума будь-якого n-розрядного числа та його доповнення 1 дає максимально можливе число, яке може бути представлено цими n-бітами. Приклад:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

Тепер що буде, якщо спробувати додати ще 1 результат. Це призведе до переповнення.

Результатом буде 1 00000 (так як ми працюємо з 4 бітовими числами (1 зліва - це перелив)

Так ,

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

Потім хтось вирішив назвати доповнення 1 + 1 як 2'комплемент. Таким чином, вищезазначене твердження стає: Будь-яке n'bit число + його доповнення 2 = 0, що означає доповнення 2 числа = - (від цього числа)

Все це викликає ще одне запитання, чому ми можемо використовувати лише (n-1) з n бітів для відображення додатного числа і чому лівий самий n-й біт являє собою знак (0 на лівому лівому біті означає + ve число, а 1 означає -ве номер). наприклад, чому ми використовуємо лише перші 31 біт int в java, щоб представити додатне число, якщо 32-й біт дорівнює 1, його -ve-число.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (результат дорівнює нулю, переносний 1 перелив)

Таким чином, система (n + 2'доповнення n) = 0 все ще працює. Єдина двозначність тут - це доповнення 2 з 12 - це 0100, що неоднозначно також представляє +8, за винятком того, що представляє -12 у системі доповнення 2s.

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


1
+ 1'ed. Це була інформація, однак, врешті-решт, я не впевнений, чому ви хочете мати підхід найбільш значущого біта, щоб представити, чи є це позитивне чи негативне число. Він має багато питань, як 0, матиме 2 подання - 0000 (+) та 1000 (-). Також додавання та віднімання не можна виконати за допомогою одного алгоритму. Коли ти кажеш нормальний 0100, то це +8, а коли ти кажеш, що двоє доповнюють 0100, то це -12 ..
hagrawal

8

Доповнення двох дозволяє зробити додавання і віднімання у звичайному порядку (як, наприклад, ви намотуєте для непідписаних чисел). Це також запобігає -0 (окремий спосіб представити 0, який не був би рівний 0 при звичайному розрядному методі порівняння чисел).


6

це спрощення сум і різниць чисел. сума негативного числа та додатного, кодифікована у 2-х доповненнях, - це те саме, що підсумовувати їх у звичайному порядку.


5

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

Приймаючи 8-бітове значення a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

Звичайна неподписана двійкова інтерпретація:
2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

Інтерпретація доповнення двох:
-2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

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


4

Доповнення двох дозволяє додавати негативні та додатні числа без особливої ​​логіки.

Якщо ви спробували додати 1 і -1, використовуючи свій метод
10000001 (-1)
+00000001 (1),
ви отримаєте
10000010 (-2)

Натомість, використовуючи доповнення двох, ми можемо додати

11111111 (-1)
+00000001 (1) ви отримуєте
00000000 (0)

Те саме стосується віднімання.

Крім того, якщо ви спробуєте відняти 4 з 6 (два додатних числа), ви можете доповнити 4 і додати два разом 6 + (-4) = 6 - 4 = 2

Це означає, що віднімання та додавання як позитивних, так і від’ємних чисел можна виконати одним і тим же ланцюгом на процесорі.


4

Щоб розширити відповіді на інші:

У двох доповненнях

  • Додавання - це той самий механізм, що і додавання простих натуральних чисел.
  • Віднімання теж не змінюється
  • Множення теж!

Ділення вимагає іншого механізму.

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


Мало того, що тільки нерозширне множення однакове . Але оскільки більшість мов високого рівня не підтримують розширення множення без явного виведення, результат буде таким самим у цих мовах.
phuclv

@ LưuVĩnhPhúc: Розширення множення зазвичай буде однаковим, але результати для підписаного та неподписаного множення гарантуються однаковими лише у тому випадку, якщо результат буде відповідати діапазону підписаного int. Деякі компілятори, як gcc, отримують щось на зразок unsigned mul(unsigned short x, unsigned short y) { return x*y; }[16-біт короткий; 32-бітний int] періодично генерує код, який буде несправно працювати, якщо продукт перевищує 2147483647.
supercat

2

Читаючи відповіді на це запитання, я натрапив на цей коментар [ред.].

Доповненням 2 у 0100 (4) буде 1100. Зараз 1100 - 12, якщо я скажу нормально. Отже, коли я кажу нормальне 1100, то це 12, але коли я кажу 2, що доповнює 1100, то це -4? Крім того, в Java, коли 1100 (припустимо, зараз 4 біти) зберігається, то як це визначити, якщо це +12 або -4 ?? - Гагравал 2 липня о 16:53

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

ЗАПИТАННЯ - Як система може встановити, як треба інтерпретувати один чи кілька суміжних байтів? Зокрема, як система може встановити, чи є дана послідовність байтів простим двійковим числом або числом доповнення 2?

ВІДПОВІДЬ - Система встановлює, як інтерпретувати послідовність байтів через типи. Види визначають

  • скільки байтів треба врахувати
  • як треба трактувати ці байти

ПРИКЛАД - Нижче ми припускаємо, що

  • charдовжиною в 1 байт
  • shortдовжиною 2 байти
  • int's і float' s - 4 байти

Зверніть увагу, що ці розміри характерні для моєї системи. Хоча вони досить поширені, вони можуть відрізнятися від системи до системи. Якщо вам цікаво, що вони є у вашій системі, скористайтеся оператором sizeof .

Перш за все ми визначимо масив, що містить 4 байти, і ініціалізуємо їх на все бінарне число 10111101, яке відповідає шістнадцятковому числу BD.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

Потім ми читаємо вміст масиву, використовуючи різні типи.

unsigned char і signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short і short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, intіfloat

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

4 байти в ОЗУ ( l_Just4Bytes[ 0..3 ]) завжди залишаються абсолютно однаковими. Єдине, що змінюється, - це те, як ми їх інтерпретуємо.

Знову ми розповідаємо системі, як їх інтерпретувати через типи .

Наприклад, вище ми використовували наступні типи для інтерпретації вмісту l_Just4Bytesмасиву

  • unsigned char: 1 байт у простому двійковому
  • signed char: 1 байт у додатку 2
  • unsigned short: 2 байти у звичайній бінарній нотації
  • short: 2 байти в додатку 2
  • unsigned int: 4 байти у звичайній бінарній нотації
  • int: 4 байти в додатку 2
  • float: 4 байти в одноточній нотації IEEE 754

[EDIT] Це повідомлення було відредаговано після коментаря користувача4581301. Дякуємо, що знайшли час, щоб скинути ці кілька корисних рядків!


Цю кодову крапку потрібно змінити, щоб читачі не повинні продовжувати прокручування вперед і назад. Краще, щоб цей масивний коментар вгорі повинен стати простим старим текстом і нехай рендерінг подбає про форматування. Ви також повинні додати застереження до біта біля кінця, де ви обговорюєте розміри та форматування, оскільки розміри не фіксовані.
user4581301

+1. Одне, що ви можете розглянути, як зробити @ mw215, - це зробити це питання / відповісти парою запис Вікі спільноти самостійно, оскільки це корисно людям, які можуть бути зацікавлені в інтерпретації сировинних байтів поза контекстом математики доповнення двох.
Вельбог

Я просто хочу знати, що доповнення 2 завжди випливає, я маю на увазі, якщо у мене є int x = -4, і то я роблю, printf("%d" , x)як це тлумачать? Також у чому різниця між unsigned intі signed intта %dі %u... це вже давно клопоче мене. Дякую.
Сурай Джайн

@Suraj Jain При використанні intтипів signedмодифікатор за замовчуванням. Це означає, що вони intі signed intабсолютно одного типу. Таким чином , ці два визначення int i = -4;і signed int i = -4;має таке ж значення.
mw215

@Suraj Jain Система встановлює, як інтерпретувати послідовність байтів через типи. Типи визначають: скільки байтів потрібно врахувати та як їх слід інтерпретувати. int4 байта в доповненні до 2 і unsigned int4 байта в звичайній двійковій запису (перевірте фактичний розмір шрифту у вашій системі з допомогою sizeofоператора).
mw215

1

Ви можете спостерігати за тим, як професор Джеррі Каїн зі Стенфорда пояснює доповнення двох, у другій лекції (пояснення щодо доповнення двох починається близько 13:00) в серії лекцій під назвою Парадигми програмування, доступні для перегляду з YouTube-каналу Standford. Ось посилання на серію лекцій: http://www.youtube.com/view_play_list?p=9D558D49CA734A02 .


0

Комплектація двох використовується, оскільки її простіше реалізувати в схемі, а також не допускає негативного нуля.

Якщо є х біт, доповнення двох буде варіюватися від + (2 ^ x / 2 + 1) до - (2 ^ x / 2). Доповнення людини буде працювати від + (2 ^ x / 2) до - (2 ^ x / 2), але дозволить отримати від'ємний нуль (0000 дорівнює 1000 в системі 4-бітових комплементів 1).


0

Ну, ваш намір насправді не повертати всі біти вашого двійкового номера. Насправді відняти кожну його цифру від 1. Це просто вдалий збіг обставин, що віднімання 1 з 1 призводить до 0, а віднімання 0 - 1 у результатах 1. Отже, перегортання бітів ефективно здійснює це віднімання.

Але чому ви знаходите різницю кожної цифри від 1? Ну, ти не є. Ваш фактичний намір полягає в обчисленні різниці даного двійкового числа від іншого двійкового числа, яке має однакову кількість цифр, але містить лише 1. Наприклад, якщо ваш номер 10110001, коли ви перевертаєте всі ці біти, ви ефективно здійснюєте обчислення (11111111 - 10110001).

Це пояснює перший крок в обчисленні комплексу Двох. Тепер включимо другий крок - додавання 1 - також на малюнку.

Додайте 1 до вищевказаного двійкового рівняння:

11111111 - 10110001 + 1

Що ви отримуєте? Це:

100000000 - 10110001

Це підсумкове рівняння. Виконуючи ці два кроки, ви намагаєтеся знайти цю, остаточну різницю: двійкове число віднімається від іншого двійкового числа з однією додатковою цифрою і містить нулі, за винятком найбільш бітової позиції означення.

Але чому ми насправді переслідуємо цю різницю? Ну, звідси, я думаю, було б краще, якби ви прочитали статтю у Вікіпедії .


0

Ми виконуємо лише операцію додавання і для додавання, і для віднімання. Додаємо другий операнд до першого операнда для додавання. Для віднімання додаємо 2-го доповнення другого операнда до першого операнда.

При представленні доповнення 2 нам не потрібні окремі цифрові компоненти для віднімання - використовуються лише суматори та доповнювачі.


0

Варто зауважити, що на деяких машинах раннього додавання до днів цифрових комп’ютерів віднімання здійснюватиметься, щоб оператор вводив значення, використовуючи різний кольоровий набір легенд на кожній клавіші (щоб кожна клавіша вводила дев'ять мінус число, яке має бути віднімаючи), а натискання спеціальної кнопки передбачає перерахунок. Таким чином, на шестицифровій машині, щоб відняти 1234 від значення, оператор натискає клавіші, які зазвичай позначають "998,765", і натискає кнопку, щоб додати це значення плюс одне до обчислення, що триває. Арифметика двох доповнення - це просто двійковий еквівалент попередньої арифметики "доповнення десяти".


0

Перевагою виконання віднімання методом доповнення є зменшення апаратної
складності. Немає необхідності в різній цифровій схемі для додавання і віднімання. Додавання і віднімання в боті виконується лише суматором.


0

Основна перевага представлення двох доповнення, яке до цього часу не згадувалося, полягає в тому, що нижні біти суми, різниці чи добутку двох доповнення залежать лише від відповідних бітів операндів. Причиною того, що 8-бітове значення для -1, полягає в 11111111тому, що віднімання будь-якого цілого числа, найнижчим 8 біт якого є 00000001будь-яке інше ціле число, найнижчим 8 біт якого 0000000дасть ціле число, найнижчим 8 біт якого є11111111. Математично значення -1 було б нескінченним рядком 1, але всі значення в межах певного цілого типу будуть або всі 1, або всі 0 минули певний момент, тому комп'ютерам зручно "підписувати-розширювати" найзначніший біт числа як би представляв нескінченне число 1 або 0.

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

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


Будь ласка, відформатуйте свою відповідь в абзаці та позначте код як код, це було б зручніше для читання, і ви отримаєте нагородження.
Сурай Джайн

@SurajJain: Це краще?
supercat

Так, краще, ніж це було раніше, я хочу запитати у вас одне, в чому різниця між підписаним char a = 1 і неподписаним char a = 1, як вони представлені в пам'яті.
Сурай Джайн

@SurajJain: У двох системах-доповненнях, де "char" менший, ніж "int" [тобто переважна більшість систем], підписані та непідписані типи char поводяться однаково, за винятком того, що підписані типи будуть розширені знаками при зчитуванні та без підписання типів не буде. У такій системі зберігання значення 194 або -62 у підписаний знак запише такий самий бітовий зразок, що і для зберігання 194 або -62 у непідписаний знак (тобто 11000010). Якщо прочитати цей бітовий зразок із підписаного знака, ви отримаєте -62, а прочитавши його з непідписаного знака
supercat

знаки-розширені засоби?
Сурай Джайн

0

Існують різні типи представлень, це:

  1. представлення безпідписаного числа
  2. представлення підписаного номера
  3. представництво доповнення
  4. Представлення двох доповнень

-Незначне представлення числа, яке використовується для представлення лише позитивних чисел

-Призначення числа, що використовується для позначення як позитивного, так і негативного числа. У поданні підписаного числа біт MSB представляє біт знаку, а біти відпочинку представляє число. Коли MSB дорівнює 0, це означає, що число є позитивним, а коли MSB - 1, то число негативне.

Проблема із поданням підписаного числа полягає в тому, що для 0 є два значення.

Проблема з представленням доповнення в одному полягає в тому, що для 0 є два значення.

Але якщо ми будемо використовувати представлення комплементу Two, то для 0 буде лише одне значення, тому ми представляємо від’ємні числа у формі доповнення двох.

Джерело: Чому від’ємні числа зберігаються у байт-форматі байтів двох


-1

Одним із задовільних відповідей того, чому доповнення Two2 використовується для представлення від'ємних чисел, а не системи доповнення One, є те, що система комплексу Two розв'язує проблему множинних уявлень 0 і необхідність перенесення в кінці навколо, що існує в системі доповнення Єдиного, що представляє негатив числа.

Для отримання додаткової інформації відвідайте https://en.wikipedia.org/wiki/Signed_number_representations

Для перенесення напродовж кінця відвідайте https://en.wikipedia.org/wiki/End-around_carry


насправді, якщо у вас є десяткова крапка і чітко видно про те, що всі біти: "0..0000.1111..1" означає, що всі ліві найнезміненіші біти дорівнюють 0, а всі праві недеталізовані біти - 1, а отже "..1" означає, що спрацьовує перенос. Тому це (механічно) "0,0001,0000..0". Це означає, що "1..1111.1111..1" дорівнює нулю! Це також означає, що для того, щоб заперечувати ціле число, ви дійсно просто перегортаєте його біти. Але зараз це стосується репрезентативних фракцій.
Роб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.