Неявное преобразование типов: если один операнд является коротким, а другой - символом, будет ли символ преобразован в короткий? - PullRequest
4 голосов
/ 16 сентября 2011

K & R утверждает, что если один из операндов является int, то другой операнд будет преобразован в int.Конечно, это только после того, как все другие правила (такие как long double, float, unsigned int и т. Д.) Были соблюдены.

По этой логике char будет преобразовано в int, если другой операнд был int.Но что, если самый высокий тип целого числа в операции - short?

Теперь, очевидно, мне не нужно явно преобразовывать char в большее целое число, но мне интересно, действительно ли ANSI-C обработать неявное преобразование между char и short под капотом?K & R ничего об этом не говорит.

Скажите, у меня есть следующие строки кода:

char x = 'x';
short y = 42;
short z = x + y;

Будет ли x преобразован в short?Или вообще не будет никакого преобразования для начала?

Просто чтобы прояснить: я не спрашиваю, нужно ли или как конвертировать из char в short.Я просто хочу знать, что происходит с неявными преобразованиями типов.

Ответы [ 2 ]

5 голосов
/ 16 сентября 2011

«Целочисленное продвижение» преобразует оба из них в int перед добавлением:

В выражении может использоваться следующее, где может использоваться int или unsigned int:

- Объект или выражение с целочисленным типом, чей ранг целочисленного преобразования меньше, чем ранг целого и беззнакового целого.

[...] Если целое число может представлять все значения исходного типазначение конвертируется в int;в противном случае он конвертируется в беззнаковое целое.Они называются целочисленными продвижениями.

(ИСО / МЭК ИСО / МЭК 9899: 1999 (E), §6.3.1.1)

0 голосов
/ 16 сентября 2011

Согласно стандарту, short никогда не может быть определено с использованием меньшего количества бит, чем char.Следовательно, x действительно будет преобразовано в short.

...