<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Luxy</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Luxy"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Luxy"/>
		<updated>2026-08-03T15:14:20Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%86%D0%B5%D0%BB%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB:_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D0%B9_%D0%BA%D0%BE%D0%B4,_%D0%BA%D0%BE%D0%B4_%D1%81%D0%BE_%D1%81%D0%B4%D0%B2%D0%B8%D0%B3%D0%BE%D0%BC,_%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4&amp;diff=35369</id>
		<title>Представление целых чисел: прямой код, код со сдвигом, дополнительный код</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%86%D0%B5%D0%BB%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB:_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D0%B9_%D0%BA%D0%BE%D0%B4,_%D0%BA%D0%BE%D0%B4_%D1%81%D0%BE_%D1%81%D0%B4%D0%B2%D0%B8%D0%B3%D0%BE%D0%BC,_%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4&amp;diff=35369"/>
				<updated>2014-01-07T19:38:13Z</updated>
		
		<summary type="html">&lt;p&gt;Luxy: Добавлен метод представления &amp;quot;дополнение до единицы&amp;quot;. Убрана лишняя точка в конце конспекта.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Выбор способа хранения целых чисел в памяти компьютера — не такая тривиальная задача, как могло бы показаться на первый взгляд. Желательно, чтобы этот способ:&lt;br /&gt;
&lt;br /&gt;
*не требовал усложнения архитектуры процессора для выполнения арифметических операций с отрицательными числами;&lt;br /&gt;
*не усложнял арифметические действия;&lt;br /&gt;
*хранил бы одинаковое количество положительных и отрицательных чисел.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим разные методы представления.&lt;br /&gt;
&lt;br /&gt;
== Прямой код ==&lt;br /&gt;
[[Файл:Представление двоичных чисел в прямом коде.jpg|230px|thumb|right|Нумерация двоичных чисел в прямом представлении]]&lt;br /&gt;
При записи числа в '''прямом коде''' (''sign-and-magnitude method'') старший разряд (''most significant bit'') является знаковым разрядом (''sign bit''). Если его значение равно нулю, то число положительное, если единице — отрицательное. В остальных разрядах (которые называются цифровыми) записывается двоичное представление модуля числа. Например, число −5 в восьмибитном типе данных, использующем прямой код, будет выглядеть так: 10000101.&lt;br /&gt;
&lt;br /&gt;
Таким способом в &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;-битовом типе данных можно представить диапазон чисел &amp;lt;tex&amp;gt; [-2^{n-1} + 1; 2^{n-1} - 1] &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Достоинства метода:&lt;br /&gt;
&lt;br /&gt;
*получить прямой код числа достаточно просто.&lt;br /&gt;
&lt;br /&gt;
Недостатки:&lt;br /&gt;
&lt;br /&gt;
*выполнение арифметических операций с отрицательными числами требует усложнения архитектуры центрального процессора (например, для вычитания невозможно использовать сумматор, необходима отдельная схема для этого);&lt;br /&gt;
*существуют два нуля (&amp;quot;+0&amp;quot; и &amp;quot;−0&amp;quot;), из-за чего усложняется арифметическое сравнение.&lt;br /&gt;
&lt;br /&gt;
Из-за этого прямой код используется очень редко.&lt;br /&gt;
&lt;br /&gt;
== Код со сдвигом ==&lt;br /&gt;
[[Файл:Представление двоичных чисел в коде со сдвигом.jpg|230px|thumb|right|Код со сдвигом. Как видно, двоичное представление зациклено по модулю &amp;lt;tex dpi=&amp;quot;100&amp;quot;&amp;gt;1000..000_{(2)}&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; нулей)]]&lt;br /&gt;
При использовании '''кода со сдвигом''' (''excess-''&amp;lt;tex&amp;gt; K &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; K = 2^{n-1}  &amp;lt;/tex&amp;gt;; также говорят ''biased representation'') целочисленный отрезок от нуля до &amp;lt;tex&amp;gt; 2^n &amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; — количество бит) сдвигается влево на &amp;lt;tex&amp;gt; 2^{n-1} &amp;lt;/tex&amp;gt;, а затем получившиеся на этом отрезке числа последовательно кодируются в порядке возрастания кодами от 000...0 до 111...1. Например, число −5 в восьмибитном типе данных, использующем код со сдвигом, превратится в −5 + 128 = 123, то есть будет выглядеть так: 01111011.&lt;br /&gt;
&lt;br /&gt;
По сути, при таком кодировании:&lt;br /&gt;
&lt;br /&gt;
*к кодируемому числу прибавляют &amp;lt;tex&amp;gt; 2^{n-1} &amp;lt;/tex&amp;gt;;&lt;br /&gt;
*переводят получившееся число в двоичную систему исчисления.&lt;br /&gt;
&lt;br /&gt;
Можно получить диапазон значений &amp;lt;tex&amp;gt; [-2^{n-1}; 2^{n-1} - 1]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Достоинства метода:&lt;br /&gt;
&lt;br /&gt;
*не требуется усложнение архитектуры процессора;&lt;br /&gt;
*нет проблемы двух нулей.&lt;br /&gt;
&lt;br /&gt;
Недостатки:&lt;br /&gt;
&lt;br /&gt;
*при арифметических операциях нужно учитывать смещение, то есть проделывать на одно действие больше (например, после «обычного» сложения двух чисел у результата будет двойное смещение, одно из которых необходимо вычесть);&lt;br /&gt;
*ряд положительных и отрицательных чисел несимметричен.&lt;br /&gt;
&lt;br /&gt;
Из-за необходимости усложнять арифметические операции код со сдвигом для представления целых чисел используется не часто, но зато применяется для хранения порядка [[Представление вещественных чисел|вещественного числа]].&lt;br /&gt;
&lt;br /&gt;
== Дополнительный код (дополнение до единицы) ==&lt;br /&gt;
[[Файл:Представление_чисел_дополнением_до_единицы.jpg|230px|thumb|right|Нумерация двоичных чисел в представлении c дополнением до единицы. В отличии от кода со сдвигом, нулю соответствуют коды 00...000 и 11...111]]&lt;br /&gt;
В качестве альтернативы представления целых чисел может использоваться код с дополнением до единицы (англ. ''Ones' complement'').&lt;br /&gt;
&lt;br /&gt;
Алгоритм получения кода числа:&lt;br /&gt;
&lt;br /&gt;
*если число положительное, то в старший разряд (который является знаковым) записывается ноль, а далее записывается само число;&lt;br /&gt;
*если число отрицательное, то код получается инвертированием представления модуля числа (получается '''обратный код''')&lt;br /&gt;
&lt;br /&gt;
Пример: переведём число −13 в восьмибитный код (так оно будет храниться в типе данных unsigned char). Прямой код модуля −13 --- 00001101, инвертируем и получаем 11110010.&lt;br /&gt;
Для получения из дополнительного кода самого числа достаточно инвертировать все разряды кода.&lt;br /&gt;
&lt;br /&gt;
Таким способом можно получить диапазон значений &amp;lt;tex&amp;gt; [-2^{n-1}+1; 2^{n-1} - 1] &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Достоинства метода:&lt;br /&gt;
&lt;br /&gt;
*Простое получение кода отрицательных чисел&lt;br /&gt;
&lt;br /&gt;
Недостатки метода:&lt;br /&gt;
&lt;br /&gt;
*выполнение арифметических операций с отрицательными числами требует усложнения архитектуры центрального процессора&lt;br /&gt;
&lt;br /&gt;
*существуют два нуля (&amp;quot;+0&amp;quot; и &amp;quot;−0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Дополнительный код (дополнение до двух) ==&lt;br /&gt;
[[Файл:Представление двоичных чисел в дополнительном коде.jpg|230px|thumb|right|Нумерация двоичных чисел в представлении c дополнением до двух.]]&lt;br /&gt;
Чаще всего для представления отрицательных чисел используется код с дополнением до двух (англ. ''two's complement'').&lt;br /&gt;
&lt;br /&gt;
Алгоритм получения дополнительного кода числа:&lt;br /&gt;
&lt;br /&gt;
*если число положительное, то в старший разряд записывается ноль, далее записывается само число;&lt;br /&gt;
*если число отрицательное, то все биты модуля числа инвертируются, то есть все единицы меняются на нули, а нули — на единицы, к инвертированному числу прибавляется единица, далее к результату дописывается знаковый разряд, равный единице.&lt;br /&gt;
&lt;br /&gt;
В качестве примера переведём число −5 в дополнительный восьмибитный код. Прямой код модуля −5 — 0000101, обратный — 1111010, прибавляем 1, получаем 1111011, приписываем 1 в качестве знакового разряда, в результате получаем 11111011.&lt;br /&gt;
&lt;br /&gt;
Также дополнительный код отрицательного числа &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt;, хранящегося в &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; битах, равен &amp;lt;tex&amp;gt; 2^n - |A|&amp;lt;/tex&amp;gt;. По сути, дополнительный код представляет собой дополнение &amp;lt;tex&amp;gt; |A| &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;: так как в &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;-разрядной арифметике &amp;lt;tex&amp;gt; 2^{n} = 0 &amp;lt;/tex&amp;gt; (двоичная запись этого числа состоит из единицы и &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; нулей, а в &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;-разрядную ячейку помещаются только &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; младших разрядов, то есть &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; нулей), то верно равенство &amp;lt;tex&amp;gt; 2^n - |A| + |A| = 0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для получения из дополнительного кода самого числа нужно инвертировать все разряды кода и прибавить к нему единицу. Можно проверить правильность, сложив дополнительный код с самим числом: результат должен быть равен &amp;lt;tex&amp;gt; 2^n &amp;lt;/tex&amp;gt;. Переведём 11111011 обратно. Инвертируем — 00000100, прибавляем 1, получаем 00000101 — модуль исходного числа −5. Проверим: 11111011 + 00000101 = 100000000.&lt;br /&gt;
&lt;br /&gt;
Можно получить диапазон значений &amp;lt;tex&amp;gt; [-2^{n-1}; 2^{n-1} - 1] &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Достоинства метода:&lt;br /&gt;
&lt;br /&gt;
*возможность заменить арифметическую операцию вычитания операцией сложения и сделать операции сложения одинаковыми для знаковых и беззнаковых типов данных, что существенно упрощает архитектуру процессора и увеличивает его быстродействие;&lt;br /&gt;
*нет проблемы двух нулей.&lt;br /&gt;
&lt;br /&gt;
Недостатки:&lt;br /&gt;
&lt;br /&gt;
*ряд положительных и отрицательных чисел несимметричен, но это не так важно: с помощью дополнительного кода выполнены гораздо более важные вещи, желаемые от способа представления целых чисел.&lt;br /&gt;
&lt;br /&gt;
==Список литературы==&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_%28%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0%29 Википедия: Дополнительный код (представление числа)]&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Signed_number_representations Wikipedia: Signed number representations]&lt;br /&gt;
&lt;br /&gt;
*Эндрю Таненбаум «Архитектура компьютера», 5-е изд., стр. 739—741&lt;br /&gt;
&lt;br /&gt;
*[http://en.wikipedia.org/wiki/Signedness Wikipedia: Signedness]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Представление информации]]&lt;/div&gt;</summary>
		<author><name>Luxy</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B4%D0%BE_%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%86%D1%8B.jpg&amp;diff=35365</id>
		<title>Файл:Представление чисел дополнением до единицы.jpg</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC_%D0%B4%D0%BE_%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%86%D1%8B.jpg&amp;diff=35365"/>
				<updated>2014-01-07T19:30:22Z</updated>
		
		<summary type="html">&lt;p&gt;Luxy: Нумерация двоичных чисел в представлении дополнения до единицы. В отличии от кода со сдвигом, нулю соответствуют коды 00...000 и 11...111&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Нумерация двоичных чисел в представлении дополнения до единицы. В отличии от кода со сдвигом, нулю соответствуют коды 00...000 и 11...111&lt;/div&gt;</summary>
		<author><name>Luxy</name></author>	</entry>

	</feed>