Подпись Short (Signed Int16) Пояснение умножения - PullRequest
0 голосов
/ 01 ноября 2019

Сокращенное подписанное (подписано Int16) Объяснение умножения?

short ss = -32768; // 0x8000 SHRT_MIN
ss *= (short) -1;
printf ("%d", (int)ss);  // Prints -32768

Какова механика того, как короткое без знака со значением -32768 раз -1 может быть само по себе? Я предполагаю, что (int) 32768 ---> переполняется и возвращается к -32768, но нигде здесь не запрашивается повышение до целочисленного или любого большего типа данных.

Поиск части спецификации C, которая определяетэто поведение.

1 Ответ

5 голосов
/ 01 ноября 2019

Здесь нет неопределенного поведения - при условии, что 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. Они называются целочисленными акциями . Все остальные типы не изменяются целочисленными акциями.

...