Я читаю стандарт и пытаюсь понять, почему этот код не будет разрешен без приведения.
void foo(char c) { }
// Way bigger than char
void foo(unsigned long int) { }
int main()
{
foo(123456789); // ambiguous
foo((unsigned long int) 123456789); // works
}
Вот что там написано:
4.13. Рейтинг целочисленного преобразования [рейтинг конв.]
Каждый целочисленный тип имеет ранг целочисленного преобразования, определенный следующим образом:
- Ранг любого целочисленного типа без знака должен равняться рангу соответствующего целочисленного типа со знаком.
- Ранг char должен быть равен рангу signed char и unsigned char.
В частности, меня беспокоит то, что он не говорит ЛЮБОЙ целочисленный тип без знака, только беззнаковый символ. Я предполагаю, что char переводится в беззнаковый тип посредством преобразования. Это правда?
char
не повышается до _2 _... проблема в том, как говорит AndreyT - что 123456789 - этоint
, и явно не лучше его усекать какchar
или передать его какunsigned long
(long
было бы так же плохо -unsigned
здесь не имеет значения). - person Tony Delroy   schedule 24.09.2014unsigned char
. - person AnT   schedule 25.09.2014