Читайте также:
|
|
ff | ee | dd | cc |
9. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
int main(){
unsigned long f = 0x 12345678;
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
Дата добавления: 2015-07-08; просмотров: 218 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Примеры преобразования типов | | | Программирование вычисления алгебраических выражений |