Сколько раз происходит преобразование типов в следующем коде? - PullRequest
1 голос
/ 10 июля 2020

Я изучал автоматическое преобразование типов (автоматическое преобразование типов) и пришел к следующему коду.

char a = 10, b = 5;
int res;
res = a / b;

Я думал, что автоматическое преобразование типов произошло только 2 раза (char a преобразовывается в int, char b преобразуется в int). Но ответ, как говорят, будет 4 раза.

Не могли бы вы объяснить, почему автоматическое преобразование типа происходит 4 раза?

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Обратите внимание, что правильным термином является преобразование . преобразование может быть либо неявным, если оно выполняется компилятором незаметно, либо явным с помощью оператора приведения, написанного программистом. Приведение всегда является явным преобразованием.

Здесь действительно происходит несколько неявных преобразований. Обратите внимание, что целочисленные константы, такие как 10, обрабатываются как int переменные внутри выражений.

  • a = 10 неявное преобразование посредством присваивания из int в char.
  • b = 5 неявное преобразование посредством присваивания из int в char.
  • a в a / b целое число, повышенное до int, как часть обычных преобразований arithemti c .
  • b в a / b - целое число, повышенное до int, как часть обычного arithemti c преобразований .

Результатом a / b будет тип int того же типа, что и левый операнд = res, поэтому дальнейшее преобразование не требуется.

См. Правила повышения неявного типа для подробнее.

0 голосов
/ 10 июля 2020

Что действительно происходит, зависит от реализации компилятора. Что должно произойти, так это 8-битное деление на 8-битное и преобразование результата в int (16-битное или 32-битное, это зависит от целевой архитектуры и компилятора).

Поскольку CPU обычно не имеет инструкций для 8-битного деления компилятор может интерпретировать это как:

res = (int) (char) ((int) a / (int) b)

Тип char обычно должен быть 8 битовое целое число со знаком, на самом деле компилятор может оптимизировать это до:

res = (int) a / (int) b

Вы не знаете наверняка, если не заглянете в ассемблер вывод.

...