что происходит, когда мы набираем приведение от более низкого типа данных к более высокому типу данных - PullRequest
0 голосов
/ 08 января 2020

Изменится ли доступность пространства памяти или просто сообщит компилятору переменную указанного типа?

Пример:

int main()
{
    char a;
    a = 123456789;
    printf("ans is %d\n",(int)a);
}

Вывод:

overflow in implicit constant conversion a= 123456789.
ans is 21.

Здесь я знаю, почему это вызывает переполнение. Но я хочу знать, как осуществляется доступ к памяти при переполнении.

1 Ответ

1 голос
/ 08 января 2020

Это довольно просто: поскольку char обычно содержит только один байт, только один байт 123456789 будет скопирован в a. Как именно это зависит от того, является ли char signed или unsigned (это зависит от реализации c, какой именно). Точные подробности см., Например, эта целочисленная ссылка на преобразование .

Что происходит , как правило (я не видел, чтобы компилятор делал что-то другое), это то, что последний байт значение копируется без изменений в a.

Для 123456789, если вы просматриваете шестнадцатеричное представление значения, оно будет 0x75bcd15. Здесь вы можете легко увидеть, что последний байт равен 0x15, то есть 21 в десятичном виде.

То, что происходит с приведением к int, когда вы печатаете значение, на самом деле ничего не произойдет ... При использовании функций с переменным аргументом, таких как printf значения меньшего типа, чем int, будут повышаться до int. Ваш printf вызов точно равен

printf("ans is %d\n",a);
...