2010-04-15 2 views
5

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

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

Есть ли реальный пример такого случая или это утверждение служит как уловка для всех возможных перестановок?

ответ

5

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

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

+1

В этом случае 'long' имеет больший ранг, чем' unsigned int', но не может представлять все его значения, поэтому оба операнда преобразуются в 'unsigned long'. Это означает, что, например, '-1L * 1U' будет большим положительным числом. – caf

Смежные вопросы