Оригинальный вопрос «почему?»
Причина в том, что определение литерального символа развивалось и изменялось, пытаясь при этом оставаться обратно совместимым с существующим кодом.
В темные дни раннего C не было типов вообще. К тому времени, когда я впервые научился программировать на C, были введены типы, но у функций не было прототипов, чтобы сообщить вызывающей стороне, какие были типы аргументов. Вместо этого было стандартизировано, что все, что передается в качестве параметра, будет либо иметь размер типа int (включая все указатели), либо это будет двойное число.
Это означало, что когда вы писали функцию, все параметры, которые не были двойными, хранились в стеке как целые, независимо от того, как вы их объявили, и компилятор поместил код в функцию, чтобы обработать это для вас.
Это делало вещи несколько противоречивыми, поэтому, когда K & R написал свою знаменитую книгу, они установили правило, что символьный литерал всегда будет повышаться до целого в любом выражении, а не только как параметр функции.
Когда комитет ANSI впервые стандартизировал C, они изменили это правило так, чтобы символьный литерал просто представлял собой int, поскольку это казалось более простым способом достижения того же самого.
Когда разрабатывался C ++, все функции должны были иметь полные прототипы (это все еще не требуется в C, хотя это общепринятая практика). Из-за этого было решено, что символьный литерал может храниться в символе. Преимущество этого в C ++ состоит в том, что функция с параметром char и функция с параметром int имеют разные сигнатуры. Это преимущество не относится к C.
Вот почему они разные. Эволюция ...