Ответ 1
То, что вы видите, является результатом так называемых "обычных арифметических преобразований", которые возникают во время арифметических выражений, в частности, двоичных по природе (принимают два аргумента).
Это описано в § 5/9:
Многие двоичные операторы, которые ожидают операнды арифметики или типа перечисления, вызывают конверсии и дают аналогичные результаты. Цель состоит в том, чтобы дать общий тип, который также является типом результата. Этот шаблон называется обычными арифметическими преобразованиями, которые определяются следующим образом:
- Если один из операндов имеет тип
long double
, другой должен быть преобразован вlong double
.
- В противном случае, если любой операндdouble
, другой должен быть преобразован вdouble
.
- В противном случае, если любой операндfloat
, другой должен быть преобразован вfloat
.
- В противном случае интегральные акции (4.5) должны выполняться на обоих операндах. 54)
- Тогда, если любой из операндовunsigned long
, другой должен быть преобразован вunsigned long
.
- В противном случае, если один операнд равенlong int
, а другойunsigned int
, то если along int
может представлять все значения aunsigned int
,unsigned int
преобразуется вlong int
; в противном случае оба операнда должны быть преобразованы вunsigned long int
.
- В противном случае, если любой операндlong
, другой должен быть преобразован вlong
.
- В противном случае, если любой операндunsigned
, другой должен быть преобразован вunsigned
.[Примечание: в противном случае единственным оставшимся случаем является то, что оба операнда
int
]
Акциями, упомянутыми в п. 4.5, являются:
1 Значение типа
char
,signed char
,unsigned char
,short int
илиunsigned short int
может быть преобразовано в rvalue типаint
, еслиint
может представлять все значения Тип источника; в противном случае исходное значение rvalue может быть преобразовано в rvalue типаunsigned int
.2 rvalue типа
wchar_t
(3.9.1) или тип перечисления (7.2) можно преобразовать в rvalue первого из следующих типов, который может представлять все значения его базового типа:int
,unsigned int
,long
илиunsigned long
.3 Значение для целочисленного битового поля (9.6) может быть преобразовано в rvalue типа
int
, еслиint
может представлять все значения битового поля; в противном случае его можно преобразовать вunsigned int
, еслиunsigned int
может представлять все значения битового поля. Если бит-поле еще больше, к нему не применяется целая реклама. Если бит-поле имеет нумерованный тип, оно рассматривается как любое другое значение этого типа для целей продвижения по службе.4 Значение типа
bool
может быть преобразовано в rvalue типаint
, при этомfalse
становится равным нулю, аtrue
становитсяone
.5 Эти преобразования называются интегральными акциями.
Здесь разделы, такие как " Мультипликативные операторы" или " Аддитивные операторы", имеют фразу: "Обычные арифметические преобразования выполняются..." для указания тип выражения.
Другими словами, когда вы выполняете интегральную арифметику, тип определяется с помощью категорий выше. В вашем случае поощрение распространяется на §4.5/1, а тип выражений - int
.