Дело в том, что многие люди, похоже, смотрят на строку кода, подобную вашей:
unsigned long long ll = 0x123456789; /* ANTI-PATTERN! Don't do this! */
и причине "о, тип unsigned long long
, поэтому значение равно unsigned long long
иэто назначается ", но это просто не так, как работает С.Литералы имеют свой собственный тип , который не зависит от контекста, в котором они используются.И тип целочисленных литералов: int
.
Это то же заблуждение, что и у людей:
const double one_third = 1 / 3; /* ANTI-PATTERN! Don't do this! */
Думая "тип слева - double
, так чтоследует назначить 0.3333333 ... ".Это просто (снова!) Не так, как работает С.Типы разделяемых литералов по-прежнему int
, поэтому правая часть вычисляется точно в 0, что затем преобразуется в double
и сохраняется в переменной one_third
.
По некоторым причинам,это поведение глубоко неинтуитивно для многих людей, поэтому существует много вариантов одного и того же вопроса.