Это довольно просто: поскольку char
обычно содержит только один байт, только один байт 123456789
будет скопирован в a
. Как именно это зависит от того, является ли char
signed
или unsigned
(это зависит от реализации c, какой именно). Точные подробности см., Например, эта целочисленная ссылка на преобразование .
Что происходит , как правило (я не видел, чтобы компилятор делал что-то другое), это то, что последний байт значение копируется без изменений в a
.
Для 123456789
, если вы просматриваете шестнадцатеричное представление значения, оно будет 0x75bcd15
. Здесь вы можете легко увидеть, что последний байт равен 0x15
, то есть 21
в десятичном виде.
То, что происходит с приведением к int
, когда вы печатаете значение, на самом деле ничего не произойдет ... При использовании функций с переменным аргументом, таких как printf
значения меньшего типа, чем int
, будут повышаться до int
. Ваш printf
вызов точно равен
printf("ans is %d\n",a);