Ответ 1
Сноски не являются нормативными. Если в сноске указано, что переполнение может привести к улавливанию значений в битах заполнения, это не совсем так, но я вижу, как это немного вводит в заблуждение. В нормативном тексте просто говорится, что поведение undefined. Размещение значений захвата в битах заполнения является одним из возможных последствий поведения undefined, но не единственного.
Нет, это не означает, что определено переполнение. Это возможно для операций с операндами intN_t
/uintN_t
для переполнения, а для этого переполнения результатом является поведение undefined.
Что-то вроде int8_t i = 127; ++i;
не имеет UB. int8_t
распространяется на целые акции, поэтому добавление выполняется так, как если бы вы написали i = (int8_t) ((int) i + 1);
. Само добавление не переполняется, и преобразование обратно в int8_t
создает результат, определенный реализацией.
Что-то вроде uint16_t u = 65535; u *= u;
имеет UB для текущих типичных реализаций, где int
имеет 32 бита знака/значения. uint16_t
тоже подвержен целым акциям, поэтому умножение выполняется так, как если бы вы написали u = (uint16_t) ((int) u * (int) u);
. Само перемножение переполняется, а поведение undefined.
Что-то вроде int64_t i = 9223372036854775807; ++i;
имеет UB почти для всех реализаций. Само добавление переполняется.