Некоторые объясняют из C ++ Primer 5th Page 35
Если мы присваиваем значение вне диапазона для объекта беззнакового типа, результатом является остаток от значенияпо модулю количество значений, которое может содержать целевой тип.
Например, 8-разрядный символ без знака может содержать значения от 0 до 255 включительно.Если мы присваиваем значение за пределами диапазона, компилятор назначает остаток этого значения по модулю 256.
unsigned char c = -1; // assuming 8-bit chars, c has value 255
Если мы присваиваем значение вне диапазона для объекта со знаком, то результат не определен,Может показаться, что программа работает, может произойти сбой или могут быть получены значения мусора.
Страница 160: Если какой-либо операнд имеет тип без знака, тип, в который преобразуются операнды, зависит от относительных размеровцелочисленные типы на машине.
... Когда подпись отличается и тип операнда без знака такой же или больше, чем у операнда со знаком, подписанный операнд преобразуется в без знака.
Остается случай, когда подписанный операнд имеет больший тип, чем беззнаковый операнд.В этом случае результат зависит от машины.Если все значения в типе без знака соответствуют большому типу, то беззнаковый операнд преобразуется в тип со знаком.Если значения не соответствуют, тогда операнд со знаком преобразуется в тип без знака.
Например, если операнды имеют тип long и unsigned int, а int и long имеют одинаковый размер, длина будет преобразована в тип unsigned int.Если тип long имеет больше битов, то беззнаковое целое будет преобразовано в long.
Я обнаружил, что чтение этой книги очень полезно.