В выражении C, где присутствуют unsigned int и sign int, какой тип будет повышен до какого типа? - PullRequest
24 голосов
/ 17 февраля 2010

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

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

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

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

Ответы [ 2 ]

44 голосов
/ 17 февраля 2010

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

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

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

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

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

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

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

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

24 голосов
/ 17 февраля 2010

Я думаю, что следующие ответы на ваш вопрос:

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

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

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

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

...