6.3.1.8p1: В противном случае целые рекламные акции: , выполняемые в обоих операндах. Затем к продвинутым операндам применяются следующие правила: если оба операнда имеют одинаковый тип , то дальнейшее преобразование не требуется. В противном случае, если оба операнда имеют целочисленные типы или оба имеют целое число без знака , операнд с типом ранга меньшего целочисленного преобразования преобразуется в тип операнда большего ранга. В противном случае, если операнд с целым типом без знака имеет ранг, больший или равный рану типа другого операнда, , тогда операнд со знаком целочисленного типа преобразуется в тип операнда с целым типом без знака. В противном случае , если тип операнда со знаком целочисленного типа может представлять все значения типа операнда с целым типом unsigned , то операнд с целым числом без знака преобразуется в тип операнда со знаком целочисленного типа , В противном случае оба операнда преобразуются в целое число без знака, соответствующее типу операнда со знаком целочисленного типа .Каким образом последнее правило продвижения целых чисел применяется в C?
Для жирного шрифта правила должен применяться, казалось бы, подразумевает, что вам нужно иметь иметь типа без знака целого, кто ранг меньше подписанного целого типа и подписанного целочисленного типа не может содержать все значения целочисленного типа без знака.
Есть ли реальный пример такого случая или это утверждение служит как уловка для всех возможных перестановок?
В этом случае 'long' имеет больший ранг, чем' unsigned int', но не может представлять все его значения, поэтому оба операнда преобразуются в 'unsigned long'. Это означает, что, например, '-1L * 1U' будет большим положительным числом. – caf