Имея чистый математический фон, это немного более математический подход для всех, кто интересуется.
Если мы начнем с 8-битного целого числа со знаком и без знака, то мы получим в основном целые числа по модулю 256, что касается сложения и умножения, при условии, что дополнение 2 используется для представления отрицательных целых чисел (и именно так это делает каждый современный процессор) ,
Где вещи различаются в двух местах: одно это операции сравнения. В некотором смысле целые числа по модулю 256 лучше всего рассматривать как круг чисел (как целые по модулю 12 на старомодном аналоговом циферблате). Чтобы сделать числовые сравнения (это x <y) значимыми, нам нужно было решить, какие числа меньше других. С точки зрения математика, мы хотим как-то встроить целые числа по модулю 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. Все остальные возможности легко эмулируются путем перевода чисел с помощью дополнительного «add». и sub 'before операции, и необходимость в этом настолько редка, что я не могу вспомнить явный пример в современном программном обеспечении (поскольку вы можете просто работать с более крупной мантиссой, скажем, 16 битами).
Другая проблема заключается в отображении 8-битного целого числа в пространство 16-битных целых. -1 идет к -1? Это то, что вы хотите, если 0xFF означает -1. В этом случае разумным является расширение знака, поэтому 0xFF переходит к 0xFFFF. С другой стороны, если 0xFF должен был представлять 255, то вы хотите, чтобы он был сопоставлен с 255, следовательно, с 0x00FF, а не с 0xFFFF.
В этом и разница между операциями «сдвиг» и «арифметический сдвиг».
В конечном счете, однако, все сводится к тому, что целые числа в программном обеспечении - это не целые числа, а представления в двоичном виде, и только некоторые из них могут быть представлены. При проектировании аппаратного обеспечения необходимо сделать выбор в отношении того, что делать в аппаратном обеспечении. Поскольку с дополнением 2 операции сложения и умножения идентичны, имеет смысл представлять отрицательные целые числа таким образом. Тогда это только вопрос операций, которые зависят от того, какие целые числа должны представлять ваши двоичные представления.