Маючи чистий математичний фон, це трохи більш математичний результат для всіх, хто цікавиться.
Якщо ми почнемо з 8-бітового цілого і підписаного цілого числа, то в основному це цілочисельний модуль 256, що стосується додавання та множення, за умови, що доповнення 2 використовується для представлення від'ємних цілих чисел (і це робить кожен сучасний процесор) .
Там, де речі різняться, це в двох місцях: одне - це порівняльні операції. У певному сенсі цілочисельний модуль 256 найкраще вважати колом чисел (як це цілочисельний модуль 12 на старомодному аналоговому годиннику). Щоб зробити числові порівняння (є х <у) значущими, нам потрібно було визначити, які числа менші за інші. З точки зору математика, ми хочемо якось вставити цілий модуль 256 в набір усіх цілих чисел. Очевидно, що робити 8-бітове ціле число, двійкове подання якого є всіма нулями до цілого числа 0. Потім ми можемо перейти до картографування інших, щоб "0 + 1" (результат обнулення регістра, скажімо, ax і збільшення його на один, через "inc ax") перейшов до цілого числа 1 тощо. Ми можемо зробити те ж саме з -1, наприклад, зіставивши '0-1' на ціле число -1 і '0-1-1' до цілого числа -2. Ми повинні переконатися, що це вбудовування є функцією, тому не можна зіставляти одне 8-бітове ціле число на два цілих числа. Таким чином, це означає, що якщо ми відобразимо всі числа в набір цілих чисел, 0 буде там, а також деякі цілі числа менше 0 і деякі більше 0. Існує 255 способів зробити це з 8-бітовим цілим числом (відповідно до мінімального рівня, який ви хочете, від 0 до -255). Тоді ви можете визначити 'x <y' в термінах '0 <y - x'.
Є два поширених випадки використання, для яких апаратне забезпечення розумне: один з усіма ненульовими цілими числами більше 0, і один з приблизно 50/50 розбиттям приблизно 0. Усі інші можливості легко емулюються перекладом чисел через додаткове "додати" і "перед операціями", і потреба в цьому настільки рідкісна, ніж я не можу придумати явного прикладу в сучасному програмному забезпеченні (оскільки ви можете просто працювати з більшою мантісою, скажімо, 16 біт).
Інша проблема полягає в відображенні 8-бітового цілого числа в просторі 16-бітних цілих чисел. Іде -1 на -1? Це те, що ви хочете, якщо 0xFF має означати -1. У цьому випадку розширення знаків - це розумно робити, так що 0xFF переходить до 0xFFFF. З іншого боку, якщо 0xFF мав на увазі 255, то ви хочете, щоб він відображався на 255, отже, на 0x00FF, а не на 0xFFFF.
Це і різниця між операціями "shift" та "арифметичний зсув".
У кінцевому рахунку, однак, зводиться до того, що int's в програмному забезпеченні - це не цілі числа, а представлення у двійковій формі, і лише деякі з них можуть бути представлені. Розробляючи обладнання, слід робити вибір щодо того, що робити в апараті. Оскільки з доповненням 2 операції додавання та множення є тотожними, є сенс представити негативні цілі таким чином. Тоді лише питання операцій, які залежать від того, які цілі числа мають бути представлені вашими бінарними представленнями.