Является ли дополнение реальным вопросом или просто историческим? - PullRequest
27 голосов
/ 02 октября 2008

Другой вопрос задавался об определении нечетности / четности в C, и идиоматический (x & 1) подход был правильно помечен как нарушенный для основанных на дополнении систем, которые C стандарт позволяет.

Существуют ли системы в реальном мире за пределами компьютерных музеев? Я занимаюсь кодированием с 1970-х годов и уверен, что никогда не встречал такого зверя.

Кто-нибудь разрабатывает или тестирует код для такой системы? И если нет, то должны ли мы беспокоиться о таких вещах или же мы должны положить их в комнату 101 вместе с бумажной лентой и перфокартами ...?

Ответы [ 9 ]

13 голосов
/ 02 октября 2008

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

Так что да, это все еще там (но вы не будете сталкиваться с этим очень часто).

12 голосов
/ 26 декабря 2009

RFC 791 p.14 определяет контрольную сумму заголовка IP как:

Поле контрольной суммы является 16-битным дополнением к сумме дополнения всех 16-битных слов в заголовке. В целях вычисления контрольной суммы значение поля контрольной суммы равно нулю.

Таким образом, дополнение все еще в значительной степени используется в реальном мире, в каждом отправляемом IP-пакете. :)

12 голосов
/ 02 октября 2008

Все это сводится к знанию ваших корней.
Да, технически это старая техника, и я, вероятно, сделал бы то, что другие люди предложили в этом вопросе, и использовал бы оператор по модулю (%) для определения нечетного или четного. Но понимание того, что является дополнением 1s (или дополнением 2s), всегда полезно знать. Независимо от того, используете ли вы их когда-либо, ваш процессор постоянно работает с этими вещами. Так что никогда не помешает понять концепцию. Теперь современные системы делают это таким образом, что вам, как правило, никогда не придется беспокоиться о таких вещах, так что это стало темой для курса «Программирование 101». Но вы должны помнить, что некоторые люди все равно будут использовать это в «реальном мире» ... например, вопреки распространенному мнению, есть люди, которые все еще используют ассемблер! Не так много, но пока процессоры не смогут понимая сырой C # и Java, кто-то все равно должен будет разобраться в этом.

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

10 голосов
/ 09 октября 2008

CDC Cyber ​​18, который я использовал в 80-х годах, был машиной с дополнением 1 с, но это было почти 30 лет назад, и с тех пор я ее не видел (однако это был также последний раз, когда я работал над PC)

7 голосов
/ 02 октября 2008

Я никогда не сталкивался с какой-либо системой комплемента, и я кодирую так же долго, как и вы.

Но я столкнулся с системой дополнения 9 - машинный язык калькулятора HP-41c. Я признаю, что это можно считать устаревшим, и я не думаю, что у них когда-либо был компилятор C для них.

6 голосов
/ 02 октября 2008

Мы вышли из нашего прошлого 1960-х Honeyboxen где-то в прошлом году, что сделало его нашей самой старой машиной на месте. Это было два дополнения. Это не значит, что знать или знать о своем дополнении - это плохо. Просто сегодня вы, вероятно, никогда не столкнетесь с проблемами комплемента, независимо от того, сколько компьютерной археологии у вас есть на работе.

Проблемы, с которыми вы, скорее всего, столкнетесь на целочисленной стороне: endian проблемы (я смотрю на вас PDP ). Кроме того, вы столкнетесь с большим количеством проблем «реального мира» (т.е. сегодня) с плавающими точечными форматами , чем с целочисленными форматами.

5 голосов
/ 27 сентября 2017

Я решил найти. Системы Unisys ClearPath имеют компилятор ANSI C (да, они называют его «Американским национальным стандартом C», для которого даже документация в формате PDF последний раз обновлялась в 2013 году. Документация доступна онлайн ;

Там все подписанные типы используют представление дополнения со следующими свойствами:

Type                 | Bits | Range
---------------------+------+-----------------
signed char          |   9  |  -2⁸+1 ...  2⁸-1
signed short         |  18  | -2¹⁷+1 ... 2¹⁷-1
signed int           |  36  | -2³⁵+1 ... 2³⁵-1
signed long int      |  36  | -2³⁵+1 ... 2³⁵-1
signed long long int |  72  | -2⁷¹+1 ... 2⁷¹-1

Примечательно, что он также по умолчанию поддерживает несоответствующие unsigned int и unsigned long, которые варьируются от 0 ... 2³⁶ - 2, но могут быть изменены на 0 ... 2³⁶ - 1 с прагмой.

5 голосов
/ 13 июля 2016

Забавно, люди задавали этот же вопрос на comp.std.c в 1993 , и никто не мог указать на машину, которая использовалась в то время. .

Так что да, я думаю, что мы можем с уверенностью сказать, что его дополнение принадлежит темному уголку нашей истории, практически мертвому, и больше не является проблемой.

1 голос
/ 19 августа 2015

Является ли дополнение человека проблемой реального мира или просто историческим?

Да, он все еще используется. Его даже используют в современных процессорах Intel. Из Руководства разработчика программного обеспечения Intel® 64 и IA-32 для архитектур 2A, стр. 3-8:

3.1.1.8 Описание Раздел

Каждая инструкция затем описывается количеством информационных разделов. Раздел «Описание» более подробно описывает назначение инструкций и требуемых операндов.

Сводка терминов, которые могут использоваться в разделе описания:
* Устаревший SSE: относится к SSE, SSE2, SSE3, SSSE3, SSE4, AESNI, PCLMULQDQ и любым будущим наборам команд, ссылающимся на регистры XMM и закодированным без префикса VEX. * VEX.vvvv. Битовое поле VEX, указывающее регистр источника или назначения (в форме дополнения 1).
* rm_field: сокращение для поля ModR / M r / m и любого REX.B
* reg_field: сокращение для поля reg ModR / M и любого REX.R

...