Дополнительный код
Дополнительный код (англ. "two’s complement", иногда "twos-complement") — наиболее распространённый способ представления отрицательных целых чисел в компьютерах. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел, что упрощает архитектуру ЭВМ. В англоязычной литературе «обратный код» (инверсия прямого кода) называют «первым дополнением» (англ. "ones' complement"), а «дополнительный код» называют «вторым дополнением» (англ. "two’s complement").
Дополнительный код для отрицательного числа можно получить инвертированием его двоичного модуля (получается "первое дополнение") и прибавлением к инверсии единицы (получается "второе дополнение"), либо вычитанием числа из нуля (сразу получается "второе дополнение").
Дополнительный код двоичного числа определяется как величина, полученная вычитанием числа из наибольшей степени двух (из для -битного второго дополнения).
История
То, что отрицательные числа в дополнительном коде можно складывать на сумматоре, было известно ещё во времена Паскаля, который и применил это свойство в своей суммирующей машине "Паскалина".
Представление отрицательного числа в дополнительном коде
При записи числа в дополнительном коде старший разряд является знаковым. Если значение старшего разряда равно 0, то это значит, что в остальных разрядах записано положительное двоичное число, совпадающее с прямым кодом.
Двоичное 8-разрядное число со знаком в дополнительном коде может представлять любое целое в диапазоне от −128 до +127. Если старший разряд равен нулю, то наибольшее целое число, которое может быть записано в оставшихся 7 разрядах, равно .
Примеры:
| Десятичное представление | Двоичное представление (8 бит), код: | ||
|---|---|---|---|
| прямой | обратный | дополнительный | |
| 127 | 0111 1111 | 0111 1111 | 0111 1111 |
| 1 | 0000 0001 | 0000 0001 | 0000 0001 |
| 0 | 0000 0000 | 0000 0000 | 0000 0000 |
| −0 | 1000 0000 | 1111 1111 | — |
| −1 | 1000 0001 | 1111 1110 | 1111 1111 |
| −2 | 1000 0010 | 1111 1101 | 1111 1110 |
| −3 | 1000 0011 | 1111 1100 | 1111 1101 |
| −4 | 1000 0100 | 1111 1011 | 1111 1100 |
| −5 | 1000 0101 | 1111 1010 | 1111 1011 |
| −6 | 1000 0110 | 1111 1001 | 1111 1010 |
| −7 | 1000 0111 | 1111 1000 | 1111 1001 |
| −8 | 1000 1000 | 1111 0111 | 1111 1000 |
| −9 | 1000 1001 | 1111 0110 | 1111 0111 |
| −10 | 1000 1010 | 1111 0101 | 1111 0110 |
| −11 | 1000 1011 | 1111 0100 | 1111 0101 |
| −127 | 1111 1111 | 1000 0000 | 1000 0001 |
| −128 | — | — | 1000 0000 |
Дополнительный код в иной системе счисления
Тот же принцип можно использовать и в компьютерном представлении любой системы счисления, например, для десятичных чисел.
Преобразования на примере десятичной системы счисления
Положительное число
Изменение значений текущих разрядов числа не производится, но дописывается знаковый старший разряд, значение которого равно 0. Например число [+12'345] будет иметь следующее представление - [012'345]
Отрицательное число
Дописываем знаковый старший разряд, равный большей цифре данной системы счисления, в нашем случае - это 9, а также изменяем остальные разряды по определённому правилу; пусть значение цифры каждого разряда будет представлено переменной , кроме знакового, тогда представим следующий алгоритм действий:
- Присвоим переменной
новое значение, равное выражению
(процесс получения обратного кода) - например отрицательное число [-12345] в прямом коде от старшего к младшему разряду будет иметь вид [9'12345], где
- знаковая цифра, а в обратном представлении кода будет иметь следующий вид - [9'87654].
- К результирующему числу прибавим
, так число [9'87654] (первое дополнение) будет иметь вид [987'655] (доп. код).
- Если возникла ситуация переноса разряда, в результате которого образовался новый разряд, то его (старший разряд) опускаем, а результирующее число считаем положительным. Результирующее положительное число будет одинаково представлено, как в прямом, так и в дополнительном коде. Например, имея возможность представить в таком виде отрицательный и положительный нуль, разберём их перевод в дополнительный код (1 знаковый и 4 дополнительных разряда):
- [+0] в прямом коде [0'0000]. Первое и второе дополнения равны [0'0000].
- [-0] в прямом коде [9'0000]. Первое дополнение - [9'9999]. При получении второго дополнения старший разряд числа [(1)0'0000] опускаем и получаем результирующее значение [0'0000], как у числа [+0].
Идея представления десятичного (как и любого другого) числа в дополнительном коде, идентична правилам для двоичной системы счисления и может использоваться в гипотетическом процессоре:
| Привычное представление | Прямой код | Первое дополнение | Второе дополнение |
|---|---|---|---|
| ... | ... | ... | ... |
| +13 | 0'0013 | 0'0013 | 0'0013 |
| +12 | 0'0012 | 0'0012 | 0'0012 |
| +11 | 0'0011 | 0'0011 | 0'0011 |
| +10 | 0'0010 | 0'0010 | 0'0010 |
| +9 | 0'0009 | 0'0009 | 0'0009 |
| +8 | 0'0008 | 0'0008 | 0'0008 |
| ... | ... | ... | ... |
| +2 | 0'0002 | 0'0002 | 0'0002 |
| +1 | 0'0001 | 0'0001 | 0'0001 |
| +0 | 0'0000 | 0'0000 | 0'0000 |
| -0 | 9'0000 | 9'9999 | 0'0000 |
| -1 | 9'0001 | 9'9998 | 9'9999 |
| -2 | 9'0002 | 9'9997 | 9'9998 |
| -3 | 9'0003 | 9'9996 | 9'9997 |
| -4 | 9'0004 | 9'9995 | 9'9996 |
| ... | ... | ... | ... |
| -9 | 9'0009 | 9'9990 | 9'9991 |
| -10 | 9'0010 | 9'9989 | 9'9990 |
| -11 | 9'0011 | 9'9988 | 9'9989 |
| -12 | 9'0012 | 9'9987 | 9'9988 |
| -13 | 9'0013 | 9'9986 | 9'9987 |
Арифметика в дополнительном коде
Сложение и вычитание
Оба числа представляются в дополнительном коде. Дополнительный код обоих чисел имеет одинаковое количество разрядов. В данном представлении числа складываются.
Знаки разные: Если в процессе сложения образуется выходящий за пределы первоначальных чисел разряд, то он опускается. Результирующее значение считается положительным, где прямой и дополнительный коды являются идентичными. Иначе — отрицательным в виде дополнительного кода.
Например:
- [1234] + [-78] → [0’1234] + [9’9922] = [(1)0’1156] = [1156].
- [-1234] + [78] → [9’8766] + [0’0078] = [9’8844] = [-1156].
Знаки одинаковые:
- Положительные числа. Разряд не опускается, результат положительный.
- Отрицательные числа. Разряд опускается, результат отрицательный в дополнительном коде.
Например:
- [1234] + [78] → [0’1234] + [0’0078] = [0’1312] = [1312].
- [-1234] + [-78] → [9’8766] + [9’9922] = [(1)9’8688] → (первое дополнение) [0’1311] → (второе дополнение или обычное представление) [-1312]. При переводе из дополнительного кода в обычное представление результирующее значение является абсолютным.
Преобразование в дополнительный код
Из прямого в дополнительный код
Преобразование числа из прямого кода в дополнительный осуществляется по следующему алгоритму.
- Если старший (знаковый) разряд числа, записанного в прямом коде, равен 0, то число положительное и никаких преобразований не делается;
- Если старший (знаковый) разряд числа, записанного в прямом коде, равен 1, то число отрицательное, все разряды числа, кроме знакового, инвертируются, а к результату прибавляется 1.
Для примера преобразуем отрицательное число , записанное в прямом коде, в дополнительный код.
Прямой код отрицательного числа :
1000 0101
- Инвертируем все разряды числа, кроме знакового, получая таким образом обратный код (первое дополнение) отрицательного числа
:
1111 1010 - Добавим к результату
, получая таким образом дополнительный код (второе дополнение) отрицательного числа
:
1111 1011
Изменение знака числа
Для преобразования отрицательного числа , записанного в дополнительном коде, в положительное число
, записанное в прямом коде, используется похожий алгоритм:
- Инвертируем все разряды отрицательного числа
, получая таким образом положительное число 4 в прямом коде:
0000 0100 - Добавив к результату
получим положительное число
в прямом коде:
0000 0101
И проверим, сложив получившееся записи и
:
0000 0101 + 1111 1011 = 0000 0000 (пятый и старше разряды выбрасываются)
p-адические числа
В системе p-адических чисел изменение знака числа осуществляется преобразованием числа в его дополнительный код. Например, если используется 5-ричная система счисления, то число, противоположное 00015 (110), равно 44445 (−110).
Реализация алгоритма нахождения модуля для дополнительного кода
TurboBasic
DEF FN TwosComplAbs%(a%) IF a% < 0 THEN a% = NOT(a% - 1) FN TwosComplAbs% = a% END DEF Pascal
function TwosComplAbs(a: integer): integer; begin if (a < 0) then TwosComplAbs := (not a) + 1 else TwosComplAbs := a; end; C/C++
int twos_compl_abs(int a) { if (a < 0) a = (~a) + 1; return a; } Реализация без ветвления
С помощью следующей формулы можно вычислить модуль числа без ветвления:
,
где: — Операция исключающего "или";
— Арифметический сдвиг вправо;
— Количество двоичных разрядов
Следующий код на языке Си вычисляет модуль по этой формуле:
int32_t fastabs32(int32_t num) { int32_t mask = (num >> 31); return ((num ^ mask) - mask); } Преимущества и недостатки
Преимущества
- Общие инструкции (процессора) для сложения, вычитания и левого сдвига для знаковых и беззнаковых чисел (различия только в арифметических флагах, которые нужно проверять для контроля переполнения в результате).
- Отсутствие числа «минус ноль».
Недостатки
- Представление отрицательного числа визуально не читается по обычным правилам, для его восприятия нужен особый навык или дополнительные вычисления для приведения в обычный вид.
- В некоторых представлениях (например, двоично-десятичный код) или их составных частях (например, мантисса числа с плавающей запятой) дополнительное кодирование неудобно.
- Модуль наибольшего числа не равен модулю наименьшего числа. Например, для восьмибитного целого со знаком, максимальное число: 12710 = 011111112, минимальное число: -12810 = 100000002. Соответственно, не для любого числа существует противоположное. Операция изменения знака может потребовать дополнительной проверки.
Пример программного преобразования
Если происходит чтение данных из файла или области памяти, где они хранятся в двоичном дополнительном коде (например, WAV файл), может оказаться необходимым преобразовать байты. Если данные хранятся в 8 битах, необходимо, чтобы значения 128-255 были отрицательными.
C# .NET / C style
byte b1 = 254; //11111110 (бинарное) byte b2 = 121; //01111001 (бинарное) byte c = 1<<(sizeof(byte)*8-1); //2 возводится в степень 7. Результат: 10000000 (бинарное) byte b1Conversion=(c ^ b1) - c; //Результат: -2. А фактически, двоичный дополнительный код. byte b2Conversion=(c ^ b2) - c; //Результат остаётся 121, потому что знаковый разряд - ноль. Расширение знака
Расширение знака (англ. sign extension[en]) — операция над двоичным числом, которая позволяет увеличить разрядность числа с сохранением знака и значения. Выполняется добавлением цифр со стороны старшего значащего разряда. Если число положительное (старший разряд равен 0), то добавляются нули, если отрицательное (старший разряд равен 1) — единицы.
Пример
Примечание: Добавленные цифры подчёркнуты
| Десятичное число | Двоичное число (8 разрядов) | Двоичное число (16 разрядов) |
|---|---|---|
| 10 | 0000 1010 | 0000 0000 0000 1010 |
| −15 | 1111 0001 | 1111 1111 1111 0001 |
См. также
- Обратный код
- Прямой код
- Целый тип
- Алгоритм Бута — специализированный алгоритм умножения для чисел в дополнительном коде
Литература
- Behrooz Parhami. 2.3. Complement Representation, 2.4. Two's- and 1's-complement numbers // Computer Arithmetic: Algorithms and Hardware Designs. — New York: Oxford University Press, 2000. — P. 22-27. — 510 p. — ISBN 0-19-512583-5.
- Самофалов К.Г., Романкевич А.М., Валуйский В.Н., Каневский Ю.С., Пиневич М.М. Прикладная теория цифровых автоматов. — Киев: Вища школа, 1987. — 375 с.
Примечания
- Florida Tech. Дата обращения: 28 ноября 2020. Архивировано 8 октября 2016 года.
- Bit Twiddling Hacks. graphics.stanford.edu. Дата обращения: 29 июня 2023. Архивировано 1 июня 2020 года.
Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Дополнительный код, Что такое Дополнительный код? Что означает Дополнительный код?
Dopolnitelnyj kod angl two s complement inogda twos complement naibolee rasprostranyonnyj sposob predstavleniya otricatelnyh celyh chisel v kompyuterah On pozvolyaet zamenit operaciyu vychitaniya na operaciyu slozheniya i sdelat operacii slozheniya i vychitaniya odinakovymi dlya znakovyh i bezznakovyh chisel chto uproshaet arhitekturu EVM V angloyazychnoj literature obratnyj kod inversiya pryamogo koda nazyvayut pervym dopolneniem angl ones complement a dopolnitelnyj kod nazyvayut vtorym dopolneniem angl two s complement Dopolnitelnyj kod dlya otricatelnogo chisla mozhno poluchit invertirovaniem ego dvoichnogo modulya poluchaetsya pervoe dopolnenie i pribavleniem k inversii edinicy poluchaetsya vtoroe dopolnenie libo vychitaniem chisla iz nulya srazu poluchaetsya vtoroe dopolnenie Dopolnitelnyj kod dvoichnogo chisla opredelyaetsya kak velichina poluchennaya vychitaniem chisla iz naibolshej stepeni dvuh iz 2N displaystyle 2 N dlya N displaystyle N bitnogo vtorogo dopolneniya IstoriyaTo chto otricatelnye chisla v dopolnitelnom kode mozhno skladyvat na summatore bylo izvestno eshyo vo vremena Paskalya kotoryj i primenil eto svojstvo v svoej summiruyushej mashine Paskalina Predstavlenie otricatelnogo chisla v dopolnitelnom kodePri zapisi chisla v dopolnitelnom kode starshij razryad yavlyaetsya znakovym Esli znachenie starshego razryada ravno 0 to eto znachit chto v ostalnyh razryadah zapisano polozhitelnoe dvoichnoe chislo sovpadayushee s pryamym kodom Dvoichnoe 8 razryadnoe chislo so znakom v dopolnitelnom kode mozhet predstavlyat lyuboe celoe v diapazone ot 128 do 127 Esli starshij razryad raven nulyu to naibolshee celoe chislo kotoroe mozhet byt zapisano v ostavshihsya 7 razryadah ravno 27 1 127 displaystyle 2 7 1 127 Primery Desyatichnoe predstavlenie Dvoichnoe predstavlenie 8 bit kod pryamoj obratnyj dopolnitelnyj127 0111 1111 0111 1111 0111 1111 1 0000 0001 0000 0001 0000 0001 0 0000 0000 0000 0000 0000 0000 0 1000 0000 1111 1111 1 1000 0001 1111 1110 1111 1111 2 1000 0010 1111 1101 1111 1110 3 1000 0011 1111 1100 1111 1101 4 1000 0100 1111 1011 1111 1100 5 1000 0101 1111 1010 1111 1011 6 1000 0110 1111 1001 1111 1010 7 1000 0111 1111 1000 1111 1001 8 1000 1000 1111 0111 1111 1000 9 1000 1001 1111 0110 1111 0111 10 1000 1010 1111 0101 1111 0110 11 1000 1011 1111 0100 1111 0101 127 1111 1111 1000 0000 1000 0001 128 1000 0000 Dopolnitelnyj kod v inoj sisteme schisleniyaTot zhe princip mozhno ispolzovat i v kompyuternom predstavlenii lyuboj sistemy schisleniya naprimer dlya desyatichnyh chisel Preobrazovaniya na primere desyatichnoj sistemy schisleniya Polozhitelnoe chislo Izmenenie znachenij tekushih razryadov chisla ne proizvoditsya no dopisyvaetsya znakovyj starshij razryad znachenie kotorogo ravno 0 Naprimer chislo 12 345 budet imet sleduyushee predstavlenie 012 345 Otricatelnoe chislo Dopisyvaem znakovyj starshij razryad ravnyj bolshej cifre dannoj sistemy schisleniya v nashem sluchae eto 9 a takzhe izmenyaem ostalnye razryady po opredelyonnomu pravilu pust znachenie cifry kazhdogo razryada budet predstavleno peremennoj x displaystyle x krome znakovogo togda predstavim sleduyushij algoritm dejstvij Prisvoim peremennoj x displaystyle x novoe znachenie ravnoe vyrazheniyu 9 x displaystyle 9 x process polucheniya obratnogo koda naprimer otricatelnoe chislo 12345 v pryamom kode ot starshego k mladshemu razryadu budet imet vid 9 12345 gde 9 displaystyle 9 znakovaya cifra a v obratnom predstavlenii koda budet imet sleduyushij vid 9 87654 K rezultiruyushemu chislu pribavim 1 displaystyle 1 tak chislo 9 87654 pervoe dopolnenie budet imet vid 987 655 dop kod Esli voznikla situaciya perenosa razryada v rezultate kotorogo obrazovalsya novyj razryad to ego starshij razryad opuskaem a rezultiruyushee chislo schitaem polozhitelnym Rezultiruyushee polozhitelnoe chislo budet odinakovo predstavleno kak v pryamom tak i v dopolnitelnom kode Naprimer imeya vozmozhnost predstavit v takom vide otricatelnyj i polozhitelnyj nul razberyom ih perevod v dopolnitelnyj kod 1 znakovyj i 4 dopolnitelnyh razryada 0 v pryamom kode 0 0000 Pervoe i vtoroe dopolneniya ravny 0 0000 0 v pryamom kode 9 0000 Pervoe dopolnenie 9 9999 Pri poluchenii vtorogo dopolneniya starshij razryad chisla 1 0 0000 opuskaem i poluchaem rezultiruyushee znachenie 0 0000 kak u chisla 0 Ideya predstavleniya desyatichnogo kak i lyubogo drugogo chisla v dopolnitelnom kode identichna pravilam dlya dvoichnoj sistemy schisleniya i mozhet ispolzovatsya v gipoteticheskom processore Privychnoe predstavlenie Pryamoj kod Pervoe dopolnenie Vtoroe dopolnenie 13 0 0013 0 0013 0 0013 12 0 0012 0 0012 0 0012 11 0 0011 0 0011 0 0011 10 0 0010 0 0010 0 0010 9 0 0009 0 0009 0 0009 8 0 0008 0 0008 0 0008 2 0 0002 0 0002 0 0002 1 0 0001 0 0001 0 0001 0 0 0000 0 0000 0 0000 0 9 0000 9 9999 0 0000 1 9 0001 9 9998 9 9999 2 9 0002 9 9997 9 9998 3 9 0003 9 9996 9 9997 4 9 0004 9 9995 9 9996 9 9 0009 9 9990 9 9991 10 9 0010 9 9989 9 9990 11 9 0011 9 9988 9 9989 12 9 0012 9 9987 9 9988 13 9 0013 9 9986 9 9987Arifmetika v dopolnitelnom kode Slozhenie i vychitanie Oba chisla predstavlyayutsya v dopolnitelnom kode Dopolnitelnyj kod oboih chisel imeet odinakovoe kolichestvo razryadov V dannom predstavlenii chisla skladyvayutsya Znaki raznye Esli v processe slozheniya obrazuetsya vyhodyashij za predely pervonachalnyh chisel razryad to on opuskaetsya Rezultiruyushee znachenie schitaetsya polozhitelnym gde pryamoj i dopolnitelnyj kody yavlyayutsya identichnymi Inache otricatelnym v vide dopolnitelnogo koda Naprimer 1234 78 0 1234 9 9922 1 0 1156 1156 1234 78 9 8766 0 0078 9 8844 1156 Znaki odinakovye Polozhitelnye chisla Razryad ne opuskaetsya rezultat polozhitelnyj Otricatelnye chisla Razryad opuskaetsya rezultat otricatelnyj v dopolnitelnom kode Naprimer 1234 78 0 1234 0 0078 0 1312 1312 1234 78 9 8766 9 9922 1 9 8688 pervoe dopolnenie 0 1311 vtoroe dopolnenie ili obychnoe predstavlenie 1312 Pri perevode iz dopolnitelnogo koda v obychnoe predstavlenie rezultiruyushee znachenie yavlyaetsya absolyutnym Preobrazovanie v dopolnitelnyj kodIz pryamogo v dopolnitelnyj kod Preobrazovanie chisla iz pryamogo koda v dopolnitelnyj osushestvlyaetsya po sleduyushemu algoritmu Esli starshij znakovyj razryad chisla zapisannogo v pryamom kode raven 0 to chislo polozhitelnoe i nikakih preobrazovanij ne delaetsya Esli starshij znakovyj razryad chisla zapisannogo v pryamom kode raven 1 to chislo otricatelnoe vse razryady chisla krome znakovogo invertiruyutsya a k rezultatu pribavlyaetsya 1 Dlya primera preobrazuem otricatelnoe chislo 5 displaystyle 5 zapisannoe v pryamom kode v dopolnitelnyj kod Pryamoj kod otricatelnogo chisla 5 displaystyle 5 1000 0101 Invertiruem vse razryady chisla krome znakovogo poluchaya takim obrazom obratnyj kod pervoe dopolnenie otricatelnogo chisla 5 displaystyle 5 1111 1010 Dobavim k rezultatu 1 displaystyle 1 poluchaya takim obrazom dopolnitelnyj kod vtoroe dopolnenie otricatelnogo chisla 5 displaystyle 5 1111 1011Izmenenie znaka chisla Dlya preobrazovaniya otricatelnogo chisla 5 displaystyle 5 zapisannogo v dopolnitelnom kode v polozhitelnoe chislo 5 displaystyle 5 zapisannoe v pryamom kode ispolzuetsya pohozhij algoritm Invertiruem vse razryady otricatelnogo chisla 5 displaystyle 5 poluchaya takim obrazom polozhitelnoe chislo 4 v pryamom kode 0000 0100 Dobaviv k rezultatu 1 displaystyle 1 poluchim polozhitelnoe chislo 5 displaystyle 5 v pryamom kode 0000 0101 I proverim slozhiv poluchivsheesya zapisi 5 displaystyle 5 i 5 displaystyle 5 0000 0101 1111 1011 0000 0000 i pyatyj i starshe razryady vybrasyvayutsya i p adicheskie chislaV sisteme p adicheskih chisel izmenenie znaka chisla osushestvlyaetsya preobrazovaniem chisla v ego dopolnitelnyj kod Naprimer esli ispolzuetsya 5 richnaya sistema schisleniya to chislo protivopolozhnoe 00015 110 ravno 44445 110 Realizaciya algoritma nahozhdeniya modulya dlya dopolnitelnogo kodaTurboBasic DEF FN TwosComplAbs a IF a lt 0 THEN a NOT a 1 FN TwosComplAbs a END DEF Pascal function TwosComplAbs a integer integer begin if a lt 0 then TwosComplAbs not a 1 else TwosComplAbs a end C C int twos compl abs int a if a lt 0 a a 1 return a Realizaciya bez vetvleniya S pomoshyu sleduyushej formuly mozhno vychislit modul chisla bez vetvleniya a a xor a shr n 1 a shr n 1 displaystyle a a text xor a text shr n 1 a text shr n 1 gde xor displaystyle text xor Operaciya isklyuchayushego ili shr displaystyle text shr Arifmeticheskij sdvig vpravo n displaystyle n Kolichestvo dvoichnyh razryadov Sleduyushij kod na yazyke Si vychislyaet modul po etoj formule int32 t fastabs32 int32 t num int32 t mask num gt gt 31 return num mask mask Preimushestva i nedostatkiPreimushestva Obshie instrukcii processora dlya slozheniya vychitaniya i levogo sdviga dlya znakovyh i bezznakovyh chisel razlichiya tolko v arifmeticheskih flagah kotorye nuzhno proveryat dlya kontrolya perepolneniya v rezultate Otsutstvie chisla minus nol Nedostatki Predstavlenie otricatelnogo chisla vizualno ne chitaetsya po obychnym pravilam dlya ego vospriyatiya nuzhen osobyj navyk ili dopolnitelnye vychisleniya dlya privedeniya v obychnyj vid V nekotoryh predstavleniyah naprimer dvoichno desyatichnyj kod ili ih sostavnyh chastyah naprimer mantissa chisla s plavayushej zapyatoj dopolnitelnoe kodirovanie neudobno Modul naibolshego chisla ne raven modulyu naimenshego chisla Naprimer dlya vosmibitnogo celogo so znakom maksimalnoe chislo 12710 011111112 minimalnoe chislo 12810 100000002 Sootvetstvenno ne dlya lyubogo chisla sushestvuet protivopolozhnoe Operaciya izmeneniya znaka mozhet potrebovat dopolnitelnoj proverki Primer programmnogo preobrazovaniyaEsli proishodit chtenie dannyh iz fajla ili oblasti pamyati gde oni hranyatsya v dvoichnom dopolnitelnom kode naprimer WAV fajl mozhet okazatsya neobhodimym preobrazovat bajty Esli dannye hranyatsya v 8 bitah neobhodimo chtoby znacheniya 128 255 byli otricatelnymi C NET C style byte b1 254 11111110 binarnoe byte b2 121 01111001 binarnoe byte c 1 lt lt sizeof byte 8 1 2 vozvoditsya v stepen 7 Rezultat 10000000 binarnoe byte b1Conversion c b1 c Rezultat 2 A fakticheski dvoichnyj dopolnitelnyj kod byte b2Conversion c b2 c Rezultat ostayotsya 121 potomu chto znakovyj razryad nol Rasshirenie znakaRasshirenie znaka angl sign extension en operaciya nad dvoichnym chislom kotoraya pozvolyaet uvelichit razryadnost chisla s sohraneniem znaka i znacheniya Vypolnyaetsya dobavleniem cifr so storony starshego znachashego razryada Esli chislo polozhitelnoe starshij razryad raven 0 to dobavlyayutsya nuli esli otricatelnoe starshij razryad raven 1 edinicy Primer Primechanie Dobavlennye cifry podchyorknuty Desyatichnoe chislo Dvoichnoe chislo 8 razryadov Dvoichnoe chislo 16 razryadov 10 0000 1010 u 0000 0000 u 0000 1010 15 1111 0001 u 1111 1111 u 1111 0001Sm takzheObratnyj kod Pryamoj kod Celyj tip Algoritm Buta specializirovannyj algoritm umnozheniya dlya chisel v dopolnitelnom kodeLiteraturaBehrooz Parhami 2 3 Complement Representation 2 4 Two s and 1 s complement numbers Computer Arithmetic Algorithms and Hardware Designs New York Oxford University Press 2000 P 22 27 510 p ISBN 0 19 512583 5 Samofalov K G Romankevich A M Valujskij V N Kanevskij Yu S Pinevich M M Prikladnaya teoriya cifrovyh avtomatov Kiev Visha shkola 1987 375 s PrimechaniyaFlorida Tech neopr Data obrasheniya 28 noyabrya 2020 Arhivirovano 8 oktyabrya 2016 goda Bit Twiddling Hacks neopr graphics stanford edu Data obrasheniya 29 iyunya 2023 Arhivirovano 1 iyunya 2020 goda
