Другие языки программирования и технологии

Отрицательные числа и дополнительный код

Вот мне всегда было интересно, какое математическое обоснование того, что при инвертировании всех битов и прибавлении единицы получается отрицательное число?
***nurdaulet ***
***nurdaulet ***
2 616
Потому что при прибавлении к отрицательному числу большего по модулю положительного числа - происходит переполнение через тип, и число получается положительное число (правильное) , без лишних манипуляций с пересчетами и т. п.

Например, -3 + 5 (в типе скажем signed char) - это будет так:
[11111101] + [00000101] = [00000001][00000010] (где левый байт теряется из-за переполнения, что и получается 2. Просто и без лишнего гемора
Arlan
Arlan
31 295
Лучший ответ
арифмометра вы не видели.. .
)
из 0 вычитаем 1
0-1 = 9
и так 9999999999 и дзиньк колокольчик - нехватило разряда
в двоичной системе 111111111111111, а чтоб колокольчик не дзинькал - старший разряд - обозначает знак числа. 1 - минус, 0 плюс.
MB
Madiar Baibosinov
14 452
Именно математического обоснования "почему так" нет.
Есть обоснование "почему так сделали" :)
Дополнительный код (инверсия и прибавление единицы) был принят для записи двоичного числа, чтобы выполнялись следующие правила:

(-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
Второе свойство выполняется.

Так, даже если наша система ничего не знает об "отрицательных числах" -- сложение этих чисел как "положительных" также приведет к правильному результату, без необходимости дальнейшей коррекции.
СА
Саня Антонов
10 997
возьми любое число, 42 например, переведи в двоичку и проверь )
Ваня Мазур
Ваня Мазур
7 861
Я думаю на ответах появились штатные сотрудники, вытягивающие это тупое болото на более или менее приличный уровень. Хотелось бы, чтобы эти усилия не пропали даром.

По поводу вопроса.
Я себе это представляю так. Пространство булевых функций конечномерно, в каком-то смысле. К примеру, любую функцию можно выразить через штрих Шеффера. Поэтому не существует уникальных функций, которые не выражались бы через другие. Таким образом все офункции оказываются взимосвязанными, всегда что-то можно выразить через другое, при довольно слабых ограничениях.

Так, отрицательные числа оказываются связанными с инвертированием и сложением.

Или вот ещё.
Дополнительный код решает проблему непрерывности диапазона целых чисел. Убрано лишнее число (разрыв в каком-то роде) -0. Выкидывание этого одного числа и дало сдвиг на 1.

Пример с двухзначными числами это просто модулярная арифметика.
Макс Рыбченко
Макс Рыбченко
2 799
Вот ты Хакир смотрю много чем интересуешься. И как информатику преподают, и как происходят действия в микропрофессоре. Наверно умный человек! Это конечно не ответ на вопрос, я ответа не знаю, с двоичными числами не особо дружу, это можно считать просто, как комментарий. И прошу не ругать за это:)