Якщо ми подивимося на обгрунтування міжнародного стандарту - Мови програмування - С у розділі 6.3.1.8
Звичайні арифметичні перетворення, то там сказано ( наголос на мене вперед ):
Правила стандарту для цих перетворень - це незначні модифікації правил у K&R: модифікації враховують додані типи та правила збереження вартості. Явна ліцензія була додана для виконання обчислень "ширшого" типу, ніж це було абсолютно необхідним, оскільки це може іноді створювати менший і швидший код, не кажучи вже про правильну відповідь частіше . Обчислення також можуть виконуватися в “вужчому” типі за правилом ніби до тих пір, поки буде отриманий однаковий кінцевий результат. Явне лиття завжди можна використовувати для отримання значення у бажаному типі
Розділ 6.3.1.8 із проекту стандарту C99 охоплює Звичайні арифметичні перетворення, які застосовуються до операндів арифметичних виразів, наприклад, розділ 6.5.6 Додаткові оператори говорять:
Якщо обидва операнди мають арифметичний тип, на них виконуються звичайні арифметичні перетворення .
Подібний текст ми знаходимо також у розділі 6.5.5 Мультиплікативні оператори . У випадку короткого операнда спочатку цілі числа підвищуються із розділу 6.3.1.1 Логічне, символи та цілі числа, де сказано:
Якщо int може представляти всі значення вихідного типу, значення перетворюється на int; в іншому випадку він перетворюється на беззнаковий int.
Вони називаються цілочисельними акціями . 48) Усі інші типи не змінюються завдяки цілочисельним акціям.
Обговорення з розділу 6.3.1.1
про Обгрунтування або міжнародного стандарту мов програмування-C на цілих заохочень насправді цікавіше, я буду вибірково цитатою б / с , що це занадто довго , щоб повністю процитувати:
Реалізація поділилася на два великі табори, які можна охарактеризувати як збереження без підпису та збереження цінності .
[...]
Без знака збереження підхід вимагає просування двох менших беззнакових типів беззнаковое міжнар. Це просте правило і дає тип, який не залежить від середовища виконання.
Підхід до збереження значення вимагає просування цих типів до підписаного int, якщо цей тип може належним чином представляти всі значення вихідного типу, а в іншому випадку для просування цих типів до беззнакового int. Таким чином, якщо середовище виконання представляє short як щось менше, ніж int, unsigned short стає int; в іншому випадку це стає непідписаним int.
У деяких випадках це може мати досить несподівані результати, як демонструє непослідовність поведінки неявного перетворення між непідписаними та більшими підписаними типами , є багато інших прикладів. Хоча в більшості випадків це призводить до того, що операції працюють належним чином.
short s=1, t=2; auto x = s+t;
тодіx
єint
.