Ответ 1
a) Из § 5/9:
Многие двоичные операторы, которые ожидают операнды арифметики или типа перечисления, вызывают конверсии и дают аналогичные результаты. Цель состоит в том, чтобы дать общий тип, который также является типом результата. Этот шаблон называется обычными арифметическими преобразованиями, которые определяются следующим образом:
- Если любой из операндов имеет тип
long double
, другой должен быть преобразован вlong double
.- В противном случае, если любой операнд
double
, другой должен быть преобразован вdouble
.- В противном случае, если любой операнд
float
, другой должен быть преобразован вfloat
.- В противном случае интегральные акции (4.5) должны выполняться на обоих операндах.
- Затем, если любой операнд
unsigned long
, другой должен быть преобразован вunsigned long
.- В противном случае, если один операнд является
long int
, а другойunsigned int
, то если along int
может представлять все значенияunsigned int
,unsigned int
преобразуется вlong int
; в противном случае оба операнда должны быть преобразованы вunsigned long int
.- В противном случае, если любой операнд
long
, другой должен быть преобразован вlong
.- В противном случае, если любой операнд
unsigned
, другой должен быть преобразован вunsigned
.[Примечание: в противном случае единственным оставшимся случаем является то, что оба операнда
int
]
Следовательно, поскольку j
unsigned
, i
продвигается до unsigned
, и добавление выполняется с использованием арифметики без знака.
b) Это UB. Результат добавления unsigned int
(согласно (a)), и, таким образом, вы переполняете int
в присваивании.
c) Из § 4.5/1:
Значение типа
char
,signed char
,unsigned char
,short int
илиunsigned short int
может быть преобразовано в rvalue типаint
, еслиint
может представлять все значения источника тип; в противном случае исходное значение rvalue может быть преобразовано в rvalue типаunsigned int
.
Поэтому, поскольку 4-байтовый int
может представлять любое значение в 2-байтовом short
или unsigned short
, оба повышаются до int
(в соответствии с правилом целых рекламных кампаний 5,9), а затем добавляются как int
с.
d) Из п. 3.9.1/4:
Незнакомые целые числа, объявленные
unsigned
, должны подчиняться законам арифметики по модулю 2 n где n - количество бит в представлении значений этого конкретного размера целого числа.
Следовательно, UINT_MAX+1
является законным (а не UB) и равен 0.