C ++ 20 будет указывать, что подписанные интегральные типы должны используйте дополнение до двух. Это не кажется большим изменением, учитывая, что (практически?) Каждая реализация в настоящее время использует два дополнения.
Но мне было интересно, может ли это изменение привести к тому, что некоторые «неопределенные поведения» станут «определенными реализацией» или даже «определенными».
Рассмотрим функцию абсолютного значения std::abs(int)
и некоторые из ее перегрузок. Стандарт C ++ включает эту функцию со ссылкой на стандарт C, в котором говорится, что поведение не определено, если результат не может быть представлен.
В дополнении до двух нет положительного аналога INT_MIN
:
abs(INT_MIN) == -INT_MIN == undefined behavior
В знаково-величинном представлении есть:
-INT_MIN == INT_MAX
Таким образом, казалось разумным, что abs()
остался с каким-то неопределенным поведением.
Как только требуется два дополнения, кажется логичным, что поведение abs(INT_MIN)
может быть полностью определено или, по крайней мере, определена реализация без каких-либо проблем с обратной совместимостью. Но я не вижу предлагаемых изменений.
Единственный недостаток, который я вижу, заключается в том, что в стандарте C ++ необходимо явно указать abs()
, а не ссылаться на описание abs()
в стандарте C. (Насколько мне известно, C не требует дополнения до двух.)
Разве это просто не было приоритетом для комитета или все еще есть причины не использовать упрощение и уверенность, которые дает мандат на дополнение двух?