Подтвердить что ты не робот

Почему не применять 2 дополнения в С++?

Новый стандарт С++ по-прежнему отказывается указывать двоичное представление целочисленных типов. Это потому, что существуют реализационные реалии С++, которые не используют 2 арифметики дополнения? Я считаю, что трудно поверить. Это потому, что комитет опасался, что будущие успехи в аппаратных средствах сделают понятие "бит" устаревшим? Снова трудно поверить. Может ли кто-нибудь пролить свет на это?

Фон: Я был удивлен дважды в одной ветке комментариев (Бенджамин Линдли ответил на этот вопрос). Во-первых, из комментария piotr:

Справа сдвига по типу подписанного типа undefined поведение

Во-вторых, от комментария Джеймса Канзе:

при назначении длинному, если значение не соответствует длине, результаты реализация определена

Мне пришлось посмотреть их в стандарте, прежде чем я им поверила. Единственной причиной для них является размещение целочисленных представлений, отличных от 2'-дополнений. Почему?

4b9b3361

Ответ 1

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

  • Даже на двухкомпонентной машине у вас может быть больше разнообразия, чем вы думаете. Два примера: у некоторых нет знака, сохраняющего правый сдвиг, только правый сдвиг, который вводит нули; общей особенностью DSP является насыщающая арифметика, при этом присвоение значения вне диапазона будет скопировать ее максимум, а не просто отбрасывать биты верхнего порядка.

Ответ 2

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

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

Ответ 3

Я предполагаю, что это происходит из-за того, что Стандарт говорит в 3.9.1[basic.fundamental]/7

этот международный стандарт допускает комплексирование 2s, 1s-дополнение и подписанные представления величины для интегральных типов.

который, я готов поспорить, пришел с языка программирования C, который перечисляет знак и величину, два дополнения и одно дополнение как единственные разрешенные представления в 6.2.6.2/2. И там было 1 система дополнений, когда C был широко распространен: кажется, наиболее часто упоминаются UNIVAC.

Ответ 4

Многие аспекты языкового стандарта являются такими, какими они есть, поскольку Комитет по стандартам крайне не хочет запрещать компиляторам вести себя так, как может полагаться существующий код. Если существует код, который будет опираться на одно поведение дополнения, то требуя, чтобы компиляторы вели себя так, как если бы базовое оборудование использовало два дополнения, это сделало бы невозможным выполнение более старого кода с использованием более новых компиляторов.

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

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