Шаг 40.
Microsoft Visual C++ 2010. Язык С/С++.
Преобразование типов данных
На этом шаге мы рассмотрим способы и особенности преобразования типов данных.
Современные компиляторы многое берут на себя, а неопытный программист этого не замечает и потому должным образом не может оценить происходящее. Но все же надо иметь представление о
преобразованиях типов данных, потому что тот же неопытный программист часто заходит в тупик в очевидных ситуациях и недоуменно разводит руками: "Чего это оно не идет? Не понимаю...".
А не понимает, потому что избалован возможностями современных компиляторов, при которых он родился и вырос. Но они его (если программист не очень грамотный) иногда подводят, и бывает
очень сильно.
Итак, при написании программ все-таки надо знать, что в выражениях обычно участвуют данные разных типов, как и в операциях присваивания, при которых левая часть имеет один тип, а правая
другой. И чтобы как-то свести концы с концами, установлены соответствующие правила преобразований данных разных типов.
Примечание.
Преобразования осуществляются для тех типов данных, для которых это имеет смысл.
При вычислении выражений, в которые входят данные разных типов, компилятор строит программу так, что все данные разных типов преобразуются к общему типу по следующим правилам:
- типы int и char могут свободно смешиваться в арифметических выражениях, т. к. перед вычислением переменная типа char автоматически преобразуется в int
(конечно, если оба типа относятся к числу). Поэтому когда мы видим, что символ может быть отрицательным числом (например, -1), то его лучше помещать в переменную, объявленную как int;
- к каждой арифметической операции применяются следующие правила: низший тип всегда преобразуется в высший: short в int, float в double,
int в long и т.д.;
- при присвоении тип значения правой части всегда преобразуется в тип левой части. Отсюда надо учитывать, что:
- если переменная, расположенная справа от знака присвоения, имеет тип float, а переменная, расположенная слева - int, то произойдет преобразование в тип int, и
дробная часть значения переменной типа float будет отброшена;
- если справа расположена переменная типа double, а слева переменная типа float, то произойдет преобразование в тип float с округлением;
- если справа расположена переменная типа long, а слева переменная типа int, то произойдет преобразование в тип int, при этом у значения переменной справа будут отброшены
старшие биты (вот здесь может возникнуть погрешность!);
- любое выражение может быть приведено к желаемому типу не автоматически при преобразованиях, а принудительно с помощью конструкции: (имя типа) выражение. Пример:
double x = 2.5;
int z = (int) x; // можно также записать: z = int (x)
На следующем шаге мы рассмотрим побитовые логические операции.
Предыдущий шаг
Содержание
Следующий шаг