Почему бы не применять дополнение 2 в C ++? - PullRequest
26 голосов
/ 13 апреля 2011

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

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

Сдвиг вправо для подписанного типа - неопределенное поведение

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

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

Я должен был найти их в стандарте, прежде чем поверить им.Единственная причина для них состоит в том, чтобы приспособить целочисленные представления не-2-дополнения.ПОЧЕМУ?

Ответы [ 4 ]

23 голосов
/ 13 апреля 2011
  • Основная проблема в определении чего-то, что не является, заключается в том, что компиляторы были построены, предполагая, что они не определены.Изменение стандарта не изменит компиляторов, и пересмотреть их, чтобы выяснить, где было сделано предположение, - трудная задача.

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

4 голосов
/ 13 апреля 2011

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

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

4 голосов
/ 13 апреля 2011

Полагаю, это потому, что в Стандарте написано 3.9.1[basic.fundamental]/7

Настоящий международный стандарт допускает 2 дополнения, 1 дополнение и представления со звездной величиной для целочисленных типов.

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

1 голос
/ 25 октября 2014

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

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

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

...