Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_1_метод_указания прога.doc
Скачиваний:
8
Добавлен:
03.11.2018
Размер:
302 Кб
Скачать

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

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

unsigned long block = 0xffeeddccL; // область памяти из 4-х байтов void *ptr = █ //указатель на начало области памяти из 4-х байтов unsigned char ch; unsigned short two_bytes; unsigned long four_bytes; //адрес переменной определяется адресом ее младшего байта ch = *(unsigned char*) ptr; //приведение адреса к типу «указатель на unsigned char» и // взятие значения printf (”%x”, ch); // cc two_bytes = *(unsigned short*) ptr; //приведение адреса к типу «указатель на unsigned short» // и взятие значения по этому адресу (2 байта) printf (”%x”, two_bytes); // ddcc

four_bytes = *(unsigned long *) ptr; ; //приведение адреса к типу «указатель на unsigned long» // и взятие значения по этому адресу (4 байта) printf (”%x”, four_bytes); // ffeeddcc

адрес переменной

ff

ee

dd

cc


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

unsigned long f = 12345678;

unsigned short of, s; of = f; //результат приведения типа – только 2 младших байта s = f >> 16;

printf("%x \n %x \t %x \n", f, s, of);

//вывод на экран: 12345678

1234 5678

31 16 5 0

8. При вычислении алгебраических выражений возможны случаи выхода за пределы значений типа. В таком случае поможет приведение типа:

//пример а)

#include <iostream.h>

#include <conio.h>

int main()

{

int signedVar = 1500000000; //значение signed <=2 147 483 647

unsigned int unsignVar = 1500000000; //значение unsigned <=4 294 967 295

signedVar = (signedVar * 2) / 3; //значение превышает диапазон signed

unsignVar = (unsignVar * 2) / 3; //значение не превышает диапазона unsigned

cout << "signedVar = " << signedVar << endl; //неверный результат

cout << "unsignVar = " << unsignVar << endl; //OK

_getch();

return 0;

}

Результаты работы:

signedVar = -431655765

unsignVar = 1000000000

//пример в)

#include <iostream.h>

#include <conio.h>

int main()

{

int intVar = 1500000000; //1,500,000,000

intVar = (intVar * 10) / 10; //значение больше 2 147 483 647

cout << "intVar = " << intVar << endl; //неверный результат

intVar = 1500000000;

intVar = (static_cast<double>(intVar) * 10) / 10; //приведение типа к double

cout << "intVar = " << intVar << endl; //верный результат

_getch();

return 0;

}

Результаты работы:

intVar = 211509811 неверный результат

intVar = 1500000000 верный результат