- •Лабораторная работа №1 Линейные и разветвленные программы
- •Примеры использования арифметических операций
- •Примеры использования операций инкремента и декремента
- •Примеры использования операций отношения
- •Примеры использования поразрядных логических операций: Поразрядное логическое умножение:
- •Логический сдвиг:
- •Поразрядное логическое сложение:
- •Сложение по модулю 2 (исключающее или):
- •Примеры более сложного использования поразрядных логических операций:
- •Примеры записи логических выражений:
- •Алгебраические выражения
- •Пример вычисления значения выражения
- •Примеры использования преобразования типов
- •2. Особенности преобразования типов int и double:
- •6. Приведение типа в случае использования указателей:
- •7. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •9. Проанализируйте преобразование типов в операторах присваивания:
- •Особенности представления чисел по двоичному основанию
- •Особенности выполнения арифметических операций над вещественными числами
- •Операции умножения и деления
- •Ошибки округления
- •Переполнение (ошибка переполнения)
- •Потеря порядка (ошибка исчезновения порядка)
- •Катастрофическая потеря порядка (ошибка потери порядка)
- •Операции сложения и вычитания
- •Переполнение (ошибка переполнения)
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Правила работы с данными вещественных типов
- •Замечания по программированию алгебраических выражений
- •Условный оператор
- •Оператор switch Пример 1. Печать событий в зависимости от года
- •Пример 2. Распознавание вводимых символов
- •Пример 3. Печать сообщений о работе программы
- •Пример 4. Селектор перечислимого типа
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
адрес переменной
|
f |
ee |
dd |
cc |
7. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
unsigned long f = 0х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 верный результат

f