Здесь нет неопределенного поведения - при условии, что int
шире, чем 16 бит.
Это:
ss *= (short) -1;
эквивалентно:
ss = ss * (short)-1;
Оба операнда *
повышаются с short
до int
(с помощью целочисленных повышений ), и умножение выполняется в типе int
. Это дает int
значение 32768
(опять же, если только INT_MAX == 32767
, что является законным, но редким в современных не встроенных системах). (В C нет арифметических операций над целочисленными типами, которые меньше int
и unsigned int
.)
Это значение int
преобразуется обратно в short
. В отличие от арифметических операций, преобразование целочисленного значения в целочисленный результат со знаком, когда значение не помещается в целевой тип, приводит к результату, определяемому реализацией (или вызывает сигнал, определяемый реализацией, но я не думаю, что какие-либо реализациисделать это).
Преобразование 32768
в тип short
будет , вероятно, yield -32768
.
Поведение преобразования со знаком указано в N1570 6.3.1.3p3:
В противном случае новый тип подписывается и значение не может быть представлено в нем;либо результат определяется реализацией, либо генерируется определяемый реализацией сигнал.
Целочисленные продвижения описаны в 6.3.1.1p2:
Если int
может представлять все значения исходного типа (как ограничено шириной для битового поля), значение преобразуется в int
;в противном случае он конвертируется в unsigned int
. Они называются целочисленными акциями . Все остальные типы не изменяются целочисленными акциями.