Урок 4.6. Преобразование типов

4.6. Преобразование типов

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

1. Если операция выполняется над данными различных типов, то оба данных приводятся к высшему из двух типов. Это преобразование называется повышением типа. В случае, когда используется данные одного типа, то никаких преобразований не производится.

Например, выражение 1/2.0 будет вычислено как 1.0/2.0 и результатом будет 0.5 типа double, так как константа 2.0 имеет тип  double, а результатом вычисления выражения 1/2 будет 0 типа int, так как константы 1 и  2 имеют тип  int и результат может иметь только тип int, т.е. дробная часть будет отброшена. Соответственно 3/2 даст 1.

2. Последовательность типов, упорядоченных от высшего к низшему определена в соответствии с внутренним представлением данных и выглядит так:

long double

|

double

|

float

|

unsigned long

|

long long

|

long

|

unsigned int< - unsigned short <-  unsigned char

|

int <- short <-  char.

Модификатор unsigned повышает ранг соответствующего типа со знаком.

3. Для операции присваивания (простой или составной) результат вычисления выражения правой части приводится к типу переменной, которой должно быть присвоено это значение. При этом может произойти повышение типа, либо его понижение. Повышение типа при присваивании обычно происходит нормально, в то время, как понижение может существенно исказить результат из-за того, что данное высшего типа не может поместиться в области памяти данного низшего типа.

Например:
int x;                                                                                  float x;
x = 3.14;  // x получит целое значение 3                  y = 3; // y получит значение 3.0

4. Для сохранения точности вычисления при выполнении арифметических операций все данные типа float преобразуются в тип double, что существенно уменьшает ошибку округления. Конечный результат преобразуется обратно в тип float, если это обусловлено соответствующим оператором описания.

Например, данные описаны так:

float a, b, c;
и имеется выражение a*b+c,

то при вычислении значения выражения a, b, c будут преобразованы в double, а результат a*b+c будет иметь тип float.

Но если данные описаны так:

float a, b;
double c;

то результат a*b+c будет иметь тип double из-за повышения типа при выполнении операции сложения.

Кроме автоматического преобразования типов, осуществляемого компилятором, Си предоставляет программисту возможность явного указания типа, к которому необходимо преобразовать некоторую величину или выражение. Это осуществляется применением операции преобразования типа, имеющей следующий общий вид записи:

(<тип>)<выражение> или <тип>(<выражение>)

Использование такой конструкции Си гарантирует, что значение выражения будет преобразовано к типу указанному в крупных скобках перед выражением. В этой операции в качестве <тип>могут быть использованы те же ключевые слова, что и в операторе описания типа, в том числе, с допустимыми модификаторами.

Рассмотрим 2 выражения Си :

d=1.6+1.7  и    d=(int)1.6+(int)1.7

при условии, что переменная d имеет тип int. В результате выполнения первого из них, значением переменной d будет 3, так как 1.6+1.7 не требует преобразования типов и дает результат типа 3.3 типа float, а понижение типа до int осуществляемое при выполнении операции присваивания, дает значение d, равное 3, из-за отбрасывания дробной части.

В результате выполнения второго выражения значением переменной d будет 2, так как указано явное преобразование констант float в тип int до их сложения. При выполнении операции присваивания преобразование типа происходить не будет, так как тип переменной совпадает с типом выражения.

Операция приведения типа чаще всего используется в тех случаях, когда по контексту не предполагается автоматического преобразования типов. Например, имеем описание int n;  выражение (double)n преобразует значение переменной n в значение типа double. Отметим, что преобразуется значение n, но не изменяется её содержимое, оно по прежнему остается типа int.

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов