Каждый раз, когда вы смешиваете «большие» значения со знаком и без знака в аддитивных и мультипликативных арифметических операциях, «выигрывает» тип без знака, и оценка выполняется в области типа без знака («большой» означает int
и более). Если исходное значение со знаком было отрицательным, оно сначала будет преобразовано в положительное значение без знака в соответствии с правилами преобразования со знаком в без знака. В вашем случае -13701
превратится в UINT_MAX + 1 - 13701
, а результат будет использован в качестве дивиденда.
Обратите внимание, что в результате преобразования со знаком в без знака на типичной 32-битной платформе int
будет получено значение без знака 4294953595
. После деления на 3
вы получите 1431651198
. Это значение слишком велико, чтобы его можно было принудительно ввести в объект short
на платформе с 16-разрядным типом short
. Попытка сделать это приводит к поведению, определяемому реализацией. Таким образом, если свойства вашей платформы такие же, как в моих предположениях, то ваш код вызывает поведение, определяемое реализацией. Формально говоря, «бессмысленное» значение 17278
, которое вы получаете, является не чем иным, как конкретным проявлением этого поведения, определенного реализацией. Возможно, что если вы скомпилируете свой код с включенной проверкой переполнения (если ваш компилятор их поддерживает), он будет задержан на назначении.