Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л_4_Операции_и_выражения.doc
Скачиваний:
10
Добавлен:
05.11.2018
Размер:
660.99 Кб
Скачать

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

int main(){

unsigned long f = 0x12345678;

unsigned short of, s;

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

s = f >> 16;

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

_getch();

return 0;

}

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

1234 5678

31 16 5 0

10. С помощью приведения типа можно получить дробную часть числа:

double value, int_value, frac_value;

frac_value = value - int(value); или

frac_value = value - static_cast<int>(value);

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

//пример а)

int main(){

int signedVar = 1500000000; //значение signed int должно быть <=2 147 483 647

unsigned int unsignVar = 1500000000;

//значение unsigned int должно быть <=4 294 967 295

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

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

cout << "signedVar = " << signedVar << endl; //неверное значение

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

_getch();

return 0;

}

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

signedVar = -431655765

unsignVar = 1000000000

//пример в)

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; //приведение типа cout << "intVar = " << intVar << endl; //верное значение

_getch();

return 0;

}

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

intVar = 211509811 неверный ответ

intVar = 1500000000 верный ответ

12. Обратите внимание на неявное преобразование типов signed char и unsigned char в следующих выражениях (напомним, что для типа char значения, большие 127, представляются отрицательными числами):

int main(){

char c = 0;

unsigned char cs = 239;

int i = cs;

cout << cs <<" " << i << endl; // я 239 (11101111 в 2с/с)

i = c = cs;

cout << c << " " << i << endl; // я -17 (11101111 в 2с/с)

c = -30; cs = 0; i = c;

cout << c << " " << i << endl; // т -30 (11100010 в 2с/с)

i = cs = c;

cout << cs << " " << i << endl; // т 226 (11100010 в 2с/с)

_getch();

return 0;

}

13. Не надо смешивать в выражениях типы int и unsigned. Обратите внимание на неявное преобразование типов int и unsigned:

unsigned ui=1;

int i=-1;

cout << i- ui << endl; //4294967294, а не -2 , переменная целая //подтягивается до беззнаковой

// исправит положение следующий оператор

cout << i- static_cast<int>(ui) << endl; //-2