Другие языки программирования и технологии
Отрицательные числа и дополнительный код
Вот мне всегда было интересно, какое математическое обоснование того, что при инвертировании всех битов и прибавлении единицы получается отрицательное число?
Потому что при прибавлении к отрицательному числу большего по модулю положительного числа - происходит переполнение через тип, и число получается положительное число (правильное) , без лишних манипуляций с пересчетами и т. п.
Например, -3 + 5 (в типе скажем signed char) - это будет так:
[11111101] + [00000101] = [00000001][00000010] (где левый байт теряется из-за переполнения, что и получается 2. Просто и без лишнего гемора
Например, -3 + 5 (в типе скажем signed char) - это будет так:
[11111101] + [00000101] = [00000001][00000010] (где левый байт теряется из-за переполнения, что и получается 2. Просто и без лишнего гемора
арифмометра вы не видели.. .
)
из 0 вычитаем 1
0-1 = 9
и так 9999999999 и дзиньк колокольчик - нехватило разряда
в двоичной системе 111111111111111, а чтоб колокольчик не дзинькал - старший разряд - обозначает знак числа. 1 - минус, 0 плюс.
)
из 0 вычитаем 1
0-1 = 9
и так 9999999999 и дзиньк колокольчик - нехватило разряда
в двоичной системе 111111111111111, а чтоб колокольчик не дзинькал - старший разряд - обозначает знак числа. 1 - минус, 0 плюс.
Именно математического обоснования "почему так" нет.
Есть обоснование "почему так сделали" :)
Дополнительный код (инверсия и прибавление единицы) был принят для записи двоичного числа, чтобы выполнялись следующие правила:
(-0) = 0
a + (-a) = 0.
Привожу пример:
0 = 00000000
(-0) = 11111111 + 1 = 1 00000000
старший разряд отбрасывается, остается 0.
Первое свойство выполняется.
Второй пример: a = 3 (к примеру)
a = 00000011
(-a) = 11111100 + 1 = 11111101
a + (-a) = 00000011 + 11111101 = 1 00000000
Второе свойство выполняется.
Так, даже если наша система ничего не знает об "отрицательных числах" -- сложение этих чисел как "положительных" также приведет к правильному результату, без необходимости дальнейшей коррекции.
Есть обоснование "почему так сделали" :)
Дополнительный код (инверсия и прибавление единицы) был принят для записи двоичного числа, чтобы выполнялись следующие правила:
(-0) = 0
a + (-a) = 0.
Привожу пример:
0 = 00000000
(-0) = 11111111 + 1 = 1 00000000
старший разряд отбрасывается, остается 0.
Первое свойство выполняется.
Второй пример: a = 3 (к примеру)
a = 00000011
(-a) = 11111100 + 1 = 11111101
a + (-a) = 00000011 + 11111101 = 1 00000000
Второе свойство выполняется.
Так, даже если наша система ничего не знает об "отрицательных числах" -- сложение этих чисел как "положительных" также приведет к правильному результату, без необходимости дальнейшей коррекции.
возьми любое число, 42 например, переведи в двоичку и проверь )
Я думаю на ответах появились штатные сотрудники, вытягивающие это тупое болото на более или менее приличный уровень. Хотелось бы, чтобы эти усилия не пропали даром.
По поводу вопроса.
Я себе это представляю так. Пространство булевых функций конечномерно, в каком-то смысле. К примеру, любую функцию можно выразить через штрих Шеффера. Поэтому не существует уникальных функций, которые не выражались бы через другие. Таким образом все офункции оказываются взимосвязанными, всегда что-то можно выразить через другое, при довольно слабых ограничениях.
Так, отрицательные числа оказываются связанными с инвертированием и сложением.
Или вот ещё.
Дополнительный код решает проблему непрерывности диапазона целых чисел. Убрано лишнее число (разрыв в каком-то роде) -0. Выкидывание этого одного числа и дало сдвиг на 1.
Пример с двухзначными числами это просто модулярная арифметика.
По поводу вопроса.
Я себе это представляю так. Пространство булевых функций конечномерно, в каком-то смысле. К примеру, любую функцию можно выразить через штрих Шеффера. Поэтому не существует уникальных функций, которые не выражались бы через другие. Таким образом все офункции оказываются взимосвязанными, всегда что-то можно выразить через другое, при довольно слабых ограничениях.
Так, отрицательные числа оказываются связанными с инвертированием и сложением.
Или вот ещё.
Дополнительный код решает проблему непрерывности диапазона целых чисел. Убрано лишнее число (разрыв в каком-то роде) -0. Выкидывание этого одного числа и дало сдвиг на 1.
Пример с двухзначными числами это просто модулярная арифметика.
Вот ты Хакир смотрю много чем интересуешься. И как информатику преподают, и как происходят действия в микропрофессоре. Наверно умный человек! Это конечно не ответ на вопрос, я ответа не знаю, с двоичными числами не особо дружу, это можно считать просто, как комментарий. И прошу не ругать за это:)
Похожие вопросы
- Нужна программа на паскале, вычисляющая дополнительный код отрицательного числа
- НА C# НАПИСАТЬ КОД Найти сумму целых отрицательных чисел, кратных 5 и принадлежащих интервалу [-20; 20].
- Как определить отрицательные числа?
- В специализированной ЭВМ целые числа рассматриваются как числа со знаком и представляются в дополнительном коде. Для х
- Особенности арифметических операций в C++, деление отрицательных чисел, вопрос ниже
- При делении отрицательного числа выводит не правильный ответ (assembler). Если беру числа 127 13 10, пишет переполнение
- Деление отрицательного числа. Ассемблер
- Число ноль это положительное или отрицательное число.
- Как представленное ниже значение в двоичном дополнительном коде преобразовать в десятичный формат? число 11010
- сколько чисел в машинном коде ?