это статья говорит:
Если все значения исходного типа могут быть представлены как int,
значение меньшего типа преобразуется в int; в противном случае это
конвертируется в беззнаковое целое
Все значения signed/unsigned char
а также signed/unsigned short
может быть представлен в виде int
поэтому, когда тип повышается до unsigned int
?
short
не может быть длиннее int
но на некоторых платформах он может быть одинакового размера. То же самое касается int
а также long
, Это означает, что если «меньший» не подписан, то и «больший» тоже должен быть.
В статье используется небрежная терминология. Тип источника не должен быть «меньше», чем int
, Вот что говорит стандарт C ++ 11:
Значение типа integer, отличного от
bool
,char16_t
,char32_t
, или жеwchar_t
чье целочисленное преобразование
ранг (4.13) меньше, чем рангint
может быть преобразовано в тип значенияint
еслиint
может представлять все
значения типа источника; в противном случае исходное значение может быть преобразовано в значение типаunsigned int
,
Есть платформы, на которых, скажем, unsigned short
а также int
оба 16 бит длиной. тем не менее, unsigned short
имеет нижний ранг чем int
по определению и подлежит интегральному продвижению. В этом случае, int
не может представлять все значения типа unsigned short
так что продвижение unsigned int
,
Изменить: C99 имеет похожую формулировку:
Следующее может быть использовано в выражении везде, где
int
или жеunsigned int
может
использоваться:
- Объект или выражение с целочисленным типом, чей коэффициент целочисленного преобразования меньше
чем или равно званиюint
а такжеunsigned int
,- Битовое поле типа
_Bool
,int
,signed int
, или жеunsigned int
,Если
int
может представлять все значения исходного типа, значение преобразуется вint
;
в противном случае он преобразуется вunsigned int
, Это называется целым числом
промо акции. 48) Все остальные типы не изменяются целочисленными акциями.
хорошо, если sizeof (char) == sizeof (int), то unsigned char будет преобразован в unsigned int