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

StackOverflow https://stackoverflow.com/questions/161797

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

Я никогда не сталкивался с системой дополнения до единицы и занимаюсь программированием столько же, сколько и вы.

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

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

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

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

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

Я решил найти один.Системы Unisys ClearPath имеют АНСИ Компилятор 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 с прагмой.

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

Да, его еще использовали.Он даже используется в современных процессорах Intel.От Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32 2А, стр. 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
* рег_поле:сокращение для поля регистрации ModR/M и любого REX.R

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top