Является ли дополнение реальным вопросом или просто историческим?
Другой вопрос, заданный об определении нечетности / четности в C, и идиоматический (x & 1) подход был правильно помечен как нарушенный для систем, основанных на комплементе, что допускает стандарт C.
Существуют ли системы в реальном мире за пределами компьютерных музеев? Я занимаюсь кодированием с 1970-х годов и уверен, что никогда не встречал такого зверя.
Кто-нибудь на самом деле разрабатывает или тестирует код для такой системы? И если нет, то должны ли мы беспокоиться о таких вещах или мы должны положить их в комнату 101 вместе с бумажной лентой и перфокартами...?
9 ответов
Это все сводится к знанию ваших корней.
Да, технически это старая техника, и я, вероятно, сделал бы то, что другие люди предложили в этом вопросе, и использовал бы оператор по модулю (%) для определения нечетного или четного. Но понимание того, что является дополнением 1s (или дополнением 2s), всегда полезно знать. Независимо от того, используете ли вы их когда-либо, ваш процессор постоянно работает с этими вещами. Так что никогда не помешает понять концепцию. Теперь современные системы делают это таким образом, что вам, как правило, никогда не приходится беспокоиться о таких вещах, поэтому это стало темой для курса "Программирование 101". Но вы должны помнить, что некоторые люди все еще используют это в "реальном мире"... например, вопреки распространенному мнению, есть люди, которые все еще используют ассемблер! Не так много, но пока процессоры не смогут понять сырой C# и Java, кому-то все равно придется разбираться в этом.
И, черт возьми, вы никогда не знаете, когда вы можете обнаружить, что вы делаете что-то, где вам действительно нужно выполнить двоичную математику, и это дополнение 1 может пригодиться.
Я работаю в области телеметрии, и у некоторых наших клиентов есть старые аналого-цифровые преобразователи, которые до сих пор используют дополнение 1. Мне просто нужно было написать код на днях, чтобы преобразовать дополнение 1 в дополнение 2, чтобы компенсировать это.
Так что да, это все еще там (но вы не будете сталкиваться с этим очень часто).
RFC 791 p.14 определяет контрольную сумму заголовка IP как:
Поле контрольной суммы является 16-битным дополнением к сумме дополнения всех 16-битных слов в заголовке. В целях вычисления контрольной суммы значение поля контрольной суммы равно нулю.
Таким образом, его дополнение все еще активно используется в реальном мире, в каждом отправляемом IP-пакете.:)
CDC Cyber 18, который я использовал в 80-х годах, был машиной с дополнением 1 с, но это было почти 30 лет назад, и с тех пор я ее не видел (однако это был также последний раз, когда я работал на других компьютерах)
Я решил найти один. Системы 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
с прагмой.
Я никогда не сталкивался с какой-либо системой комплемента, и я кодирую так же долго, как и вы.
Но я столкнулся с системой дополнения 9 - машинный язык калькулятора HP-41c. Я признаю, что это можно считать устаревшим, и я не думаю, что у них когда-либо был C-компилятор для них.
В прошлом году мы сняли Honeyboxen прошлого 1960-х годов, что сделало его нашей самой старой машиной на месте. Это было два дополнения. Это не значит, что знать или знать о своем дополнении - это плохо. Просто, вы, вероятно, никогда не столкнетесь с чьими-то дополнительными проблемами сегодня, независимо от того, сколько компьютерной археологии у вас есть на работе.
Проблемы, с которыми вы, скорее всего, столкнетесь на целочисленной стороне, являются порядковыми (я смотрю на вас, PDP). Кроме того, вы столкнетесь с большим количеством "реальных" (то есть современных) проблем с форматами с плавающей запятой , чем с целочисленными.
Забавно, но люди задавали этот же вопрос на comp.std.c в 1993 году, и никто не мог указать на один дополнительный компьютер, который использовался тогда.
Так что да, я думаю, что мы можем с уверенностью сказать, что чей-то комплимент принадлежит темному уголку нашей истории, практически мертв, и больше не является проблемой.
Является ли дополнение реальным вопросом или просто историческим?
Да, он все еще используется. Его даже используют в современных процессорах 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