Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Преобразование типов данных
Исходно предполагается, что пользователь правильно использует типы констант и переменных. Что произойдет, если в выражениях присутствуют данные различных типов? В этом случае язык Си выполняет автоматическое приведение типов данных. Например, какое число будет записано в переменной а после инициализации int а=11.54; Так как переменная а определяется как переменная целого типа, то дробная часть вещественной константы 11.54 будет отброшена без округления и в ячейке переменной а будет записано целое число 11. То же самое произойдет, т.е. не будет учитываться дробная часть числа, если исполнить следующие операторы: float i; i=1/10; Это происходит, потому что в начале вычисляется правая часть выражения, а она содержит только целые константы 1 и 10, следовательно, результат тоже будет целое число: 1/10=0, а не 0.1 как ожидалось. Окончательно переменной i будет присвоено значение 0 и это несмотря на то, что она определяется вещественной. В общем случае при расчете арифметических выражений приведение типов данных в языке Си происходит следующим образом: 1) все переменные типа char преобразуются в тип int, переменные типа float - в тип double. 2) для любой пары операндов (т.е. в результате вычисления, например, суммы или произведения двух чисел) происходит следующее преобразование: – если хотя бы один из операндов double, то и второй преобразуется в этот тип; – если хотя бы один из операндов long, то и другой преобразуется в long; – если хотя бы один из операндов unsigned, то и другой преобразуется в unsigned. 3) конечный результат после операции присваивания приводится к типу переменной в левой части выражения. Рассмотрим пример вычисления арифметического выражения: char а=25, b=20; int i, j, long k; double d=l.55; i=a*b; k=10000*b; j = b*d; printf(“i=%d k=%ld j=%d”, i, k, j); При вычислении значения переменной i хотя обе переменные имеют тип char и как будто бы результат перемножения должен выйти за максимальные размеры, но по первому правилу обе переменные приводятся к целому типу. В этом случае результат за допустимые пределы не выйдет i=25*20=500. Для второй переменной k целого типа результат выходит за пределы целого, хотя переменная k объявлена типа длинного целого, поэтому результат перемножения будет неверный. Чтобы исправить эту ошибку необходимо строчку переписать следующим образом: k=(long)10000*b; Для третьей переменной j результатом перемножения будет вещественное число двойной точности, при присвоении этого результата происходит приведение типа (double)®(int) и при этом происходит потеря дробной части полученного произведения. пределы.
|