Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Инорм и програм - Метод. указания-3-й семестр.doc
Скачиваний:
10
Добавлен:
21.11.2018
Размер:
1.58 Mб
Скачать

Теоретическая часть Преобразование типов операндов

При выполнении вычислений в программах на языках высокого уровня в выражениях желательно использовать константы и переменные одного типа, однако это не всегда является возможным. Многие языки программирования высокого уровня не позволяют смешивать в выражениях переменные разных типов, но язык Си позволяет это делать.

Если в выражении в программе на языке Си используются операнды различных типов, то это выражение не считается ошибочным, а в нем производится автоматическое преобразование типов операндов:

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

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

long double  double  float  long int  int  short int  char

  • при выполнении операции присваивания значение выражения приводится с типу того операнда, который стоит слева от знака равенства (=), при этом значение выражения может "усекаться". Это происходит в случае, если тип переменной, которой должно быть присвоено значение, имеет меньшую длину, чем полученное значение выражения.

Рассмотрим для примера следующую простую программу:

void main(void)

{

char a;

int x = 100, y = 383;

a = x+y;

printf("x = %d, y=%d, x+y = %d\n",x,y,a);

}

В результате выполнения этой программы на экран будет выведена следующая строка:

x = 100, y=383, x+y = -29

Полученный результат объясняется тем, что значение выражения имеет тип int, а присваивается это значение переменной а, которая имеет тип char, ‑ в результате происходит усечение результата (см. )

0

0

0

0

0

0

0

1

1

1

1

0

0

0

1

1

x+y=483

1

1

1

0

0

0

1

1

a=-29

Рис. 2. Пример "усечения" данных

Схема усечения результата, показанная на рисунке, построена исходя из предположения, что данные типа int имеют длину 2 байта (sizeof(int)=2). Таким образом, в переменную а записываются младшие 8 бит результата – 11100011, а учитывая, что старший разряд – знаковый, значение а получается равным -29.