Подтвердить что ты не робот

В выражении C, где присутствуют unsigned int и signed int, какой тип будет продвинут на какой тип?

У меня есть запрос о правилах продвижения типов данных в стандарте языка C. В C99 говорится, что:

C целых рекламных акций также требует, чтобы "если int может представлять все значения исходного типа, значение преобразуется в int, иначе оно преобразуется в unsigned int."

Мои вопросы в случае выражения языка C, где присутствуют unsigned int и signed int, какой тип будет продвигаться к типу?

например. int не может представлять все значения unsigned int (значения, превышающие значения MAX_INT), тогда как unsigned int не может представлять значения -ve, поэтому какой тип способствует тому, что в таких случаях?

4b9b3361

Ответ 1

Думаю, на ваш вопрос ответит следующий вопрос:

6.3.1.3 Целочисленные и беззнаковые целые числа

1 Когда значение с целым типом преобразован в другой целочисленный тип кроме _Bool, если это значение может быть представленный новым типом, это без изменений.

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

3 В противном случае, новый тип подписан и значение в нем не может быть представлено; или результат определяется реализацией или сигнал, определяемый реализацией, поднят.

Ответ 2

Я думаю, вы смешиваете две вещи. Продвижение - это процесс, при котором значения целочисленного типа "меньше", которые int/unsigned int преобразуются либо в int, либо в unsigned int. Правила выражаются несколько странно (в основном для удобства обработки char), но убедитесь, что значение и знак сохранены.

Тогда существует другое понятие обычного арифметического преобразования, посредством которого операнды арифметических операторов преобразуются в общий тип. Он начинается с продвижения операнда (либо int, либо без знака), если они имеют тип меньший, чем int, а затем выбирают целевой тип следующим процессом (для целых типов, 6.3.1.8/1)

Если оба операнда имеют один и тот же тип, то дальнейшее преобразование не требуется.

В противном случае, если оба операнда имеют целочисленные типы или оба имеют unsigned целочисленных типов, операнд с типом меньшего целочисленного ранга преобразования преобразуется в тип операнда с большим рангом.

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

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

В противном случае оба операнда преобразуются в целочисленный тип без знака соответствующий типу операнда со знаком целочисленного типа.

(Обратите внимание, что ISTR, что эти правила немного изменились между C89 и C99)