Что такое дополнение 1?

#binary #integer-arithmetic

Вопрос:

https://www.ietf.org/rfc/rfc1071.txt

Я вижу, что «дополнение 1» упомянуто выше. Но я не нахожу его официального определения. Может ли кто-нибудь сообщить мне, что это такое?

Ответ №1:

В арифметике дополнения единиц последний бит переноса оборачивается и добавляется к результату (перенос в конце). Это также описано в RFC 1071:

На машине дополнения 2 сумма дополнения 1 должна быть вычислена с помощью «переноса конца», т. е. Любые переполнения из наиболее значимых битов добавляются в наименее значимые биты.

В псевдокоде это может быть реализовано следующим образом:

 Function Sum(a: Int16, b: Int16): Int16 {
    c: Int32 := a   b
    return (c AND 0xFFFF)   (c >> 16)
}
 

Пример

    F000
   1009
-------
   0009
   0001 // add carry
-------
   000A
 

Причина, по которой арифметика дополнения единиц используется в RFC 1071, заключается, я полагаю, в том, что многие компьютерные системы использовали ее в то время, когда в 1970-х годах была разработана контрольная сумма в Интернете. На этой странице Википедии описано, почему перенос в конце необходим, когда биты представляют целые числа со знаком.

Ответ №2:

дополнение 1-это представление чисел, в котором, чтобы получить отрицательное значение числа, вы просто переворачиваете все биты. Сложение в этом формате будет просто включать представление чисел как таковых, а затем выполнение двоичного сложения.