Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Примеры преобразования типов

Читайте также:
  1. А. Атипові м'язові волокна целомічного типу
  2. Анализ типовых схем базирования.
  3. влияние ступеней специализации и типов производства на минимально допустимые и оптимальные размеры производственных мощностей машиностроительных предприятий
  4. Внутренний мир архетипов
  5. Выбор типового выпрямительного устройства
  6. Генетических типов
  7. Глава 14. Россия в конце XVII - первой четверти XVIII в. Петровские преобразования.

1. Внимание!!! Иногда при смешивании в одном выражении операндов разных арифметических типов могут получиться «неожиданные» результаты. Например:

 

int main()

{

int a=8, b=5;

double var1, var2;

var1 = a/b; // 1, т.к. выполняется целочисленное деление

var2 = (double)a/b; //результат имеет ожидаемое значение1.6

cout << var1 << " " << var2 << endl;

_getch();

return 0;

}

 

2. Особенности преобразования типов int и double:

 

int main()

{double d=3.2, x;

int i=2, j;

x = (j = d /i)*2; // i преобразуется к типу double, результат деления = 1.6

// при присваивании j значение 1.6 усекается до 1

printf ("x=%f\t, j=%d\n", x, j); // х=2.000000, j=1

 

j =(x = d /i)*2; //i преобразуется к типу double, результат деления = 1.6

printf ("x=%f\t, j=%d\n", x, j);
// x=1.600000 j=3 (3.2 усекается при присваивании до 3)

 

j =d*(x =2.5/ d); //правая часть выражения для j получит значение 2.5

//усекается при присваивании до 2

printf ("j=%d\n", j); // j=2

 

x=d*(j =((int)2.9+1.1)/d); // значение выражения ((int)2.9+1.1) равно 3.1

// значение выражения ((int)2.9 + 1.1)/d) < 1 и при присваивании j усекается до 0

 

printf ("x=%f\t, j=%d\n", x, j); //значит x=0.000000, j=0

_getch();

return 0;

}

 

3. Чтобы вывести на экран код символа, нужно применить операцию явного преобразования. Например:

int main()

{ char c= 'a';

cout << (unsigned) c << endl; // будет напечатан код символа 97

_getch();

return 0;

}

4. Переменной перечислимого типа нельзя присвоить значение с помощью оператора ввода. Однако можно ввести значение для переменной целого типа и воспользоваться далее приведением типа:

enum Predmet {alg, geom, progr, analiz};

int main() {

Predmet pred (progr);

cout << pred << endl; // 2 - внутреннее представление переменной

int i=3;

pred = (Predmet) i; // преобразование к перечислимому типу

cout << pred << endl; // 3 - внутреннее представление

// нового значения переменной

_getch();

return 0;

}

 

Для переменной перечислимого типа нельзя выполнить также и присваивание, необходимо приведение типов:

pred = (Predmet)3;

5. Функциональная форма преобразования типа – требуемый_тип (аргумент) – не может применяться для типов со сложным наименованием (например, unsigned long (x/3+2) вызовет ошибку компиляции).

В таком случае удобно использовать форму (требуемый_тип) аргумент иливыполнять явное преобразование с помощью typedef:

Например, если имеем:

typedef unsigned long UL;

typefef char * PCH;

то можно применить функциональную запись преобразования типа в виде:

UL (x/3+2) или PCH(0777);

6. Приведение типов может быть полезным при работе с условными операторами. Сравните приведенные ниже выражения (они на самом деле решают одну задачу):

if (x > 15) x = x – 15; x =x – 15 * (unsigned) (x > 15);

 

7. Проанализируйте преобразование типов в операторах присваивания:

int main()

{double d; float f; long l; short sh;

 

sh = l= f = d = 100/3; //целое деление, т.к. числа без точки

//присваивание выполняется справа налево

printf ("d=%lf\t", d); // 33.000000

printf ("f=%f\t", f); // 33.000000

printf ("l=%d\t", l); // 33

printf ("sh=%d\t\n", sh); // 33

 

d = f= l = sh = 100/3; //целое деление

printf ("sh=%d\t", sh); // 33

printf ("l=%d\t", l); // 33

printf ("f=%f\t", f); // 33.000000

printf ("d=%lf\t\n", d); // 33.000000

 

sh = l= f = d = 100/3.; //деление с плавающей точкой

printf ("d=%lf\t", d); // 33.333333

printf ("f=%f\t", f); // 33.333332

printf ("l=%d\t", l); // 33

printf ("sh=%d\t\n", sh); // 33

 

d = f= l = sh = (double)100/3; // целое деление, приведение типа к double

printf ("sh=%d\t", sh); // 33

printf ("l=%d\t", l); // 33

printf ("f=%f\t", f); // 33

printf ("d=%lf\t\n", d); // 33

 

sh = l= f = d = (double)(100000/3); // целое деление, приведение типа к double

printf ("d=%lf\t", d); // 33333

printf ("f=%f\t", f); // 33333

printf ("l=%d\t", l); // 33333

printf ("sh=%d\t\n", sh); //-32203 число не попадает в диапазон типа!!

 

d = f= l = sh = 100000/3; //целое деление

printf ("sh=%d\t", sh); //-32203 число не попадает в диапазон типа!!

printf ("l=%d\t", l); // все остальные присваивания будут неверны

printf ("f=%f\t", f);

printf ("d=%lf\t\n", d);

_getch();

return 0;

}

 

8. Приведение типа в случае использования указателей:

// (пример пока сложный для понимания)

int main() {

unsigned long block = 0xffeeddccL; // область памяти из 4-х байтов

void *ptr = &block; //указатель на начало области

unsigned char ch;

unsigned short two_bytes;

unsigned long four_bytes;

//адрес переменной определяется адресом ее младшего байта

ch = *(unsigned char*) ptr; // взятие значения по адресу (1 байт)

printf ("%x\n", ch); // cc

two_bytes = *(unsigned short*) ptr; //взятие значения по адресу (2 байта)

printf ("%x\n", two_bytes); // ddcc

 

four_bytes = *(unsigned long *) ptr;; //взятие значения по адресу (4 байта)

printf ("%x\n", four_bytes); // ffeeddcc

_getch();

return 0;

}


Дата добавления: 2015-07-08; просмотров: 150 | Нарушение авторских прав


Читайте в этой же книге: Результат вычисления выражения характеризуется значением и типом. Операции выполняются в соответствии с их приоритетами. | Классификация операций | Приоритеты (ранги) операций | Арифметические операции | Выделение цифр в целом числе | Операции присваивания | Примеры использования | Логические выражения и примеры их записи | Пример 6. | Программирование вычисления алгебраических выражений |
<== предыдущая страница | следующая страница ==>
Правила преобразования типов| Адрес переменной

mybiblioteka.su - 2015-2024 год. (0.012 сек.)