Как последнее правило целочисленного продвижения когда-либо применяется в C? - PullRequest
5 голосов
/ 16 апреля 2010

6.3.1.8p1: в противном случае целочисленные рекламные акции выполняется на обоих операндах. Затем к повышенным операндам применяются следующие правила: Если оба операнда имеют одинаковые типа, то дальнейшее преобразование не требуется. В противном случае, если оба операнда имеют целочисленные типы со знаком или оба имеют целое число без знака типы, операнд с типом меньшего целого ранга преобразования преобразуется в тип операнда с большим рангом. В противном случае, если операнд с целым типом без знака имеет ранг, больший или равный рангу типа другого операнда, тогда операнд с целым типом со знаком преобразуется в тип операнда с целым типом без знака. Иначе, если тип операнда со знаком целого типа может представлять все значения типа операнда со знаком без знака целочисленный тип, затем операнд с целым типом без знака преобразуется в тип операнда с целым типом со знаком. В противном случае оба операнда преобразуются в целочисленный тип без знака, соответствующий типу операнда со знаком целочисленный тип.

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

Существует ли в реальном мире пример такого случая или это утверждение служит всеобъемлющим для охвата всех возможных перестановок?

1 Ответ

5 голосов
/ 16 апреля 2010

Если бы у вас была платформа, где sizeof(long int)==sizeof(int), то signed long int и unsigned int подпадают под это правило. В любом случае, стандарт не предписывает, что конверсионный ранг эквивалентен размеру, только тот конверсионный ранг обеспечивает порядок, который является действительным упорядочением по размеру (6.3.1.1.p1.1 (sp?)):

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

...