Читайте также:
|
|
Преобразование типов в арифметических выражениях:
битовое_поле – сохраняет то же значение;
char – расширение нулем или знаком в зависимости от умолчания для char;
unsigned char – старшие байты заполняются нулем;
signed char – расширение знаком;
unsigned short – преобразуется в unsigned int, сохраняется то же значение;
short – сохраняется то же значение;
enum – сохраняется то же значение;
Иерархия типов данных:
тип данных | старшинство |
long double | старший |
double | |
float | |
unsigned long | |
long | |
unsigned int | |
int | |
unsigned short | |
short | |
unsigned char | |
char | |
bool | младший |
Преобразование младшего целого типа к старшему целому типу требует расширения значения на некоторое количество бит. Старшие биты могут заполняться либо нулями (размножение нуля), либо самым старшим битом преобразуемого значения (размножение знака).
Преобразование типа short в unsigned short или в int,
int в unsigned int и
long в unsigned long
не меняет двоичный код значения.
Преобразование типа int в long или в unsigned long
выполняется размножением знака.
Преобразование типа unsigned в long unsigned,
выполняется добавлением нулевых старших байтов.
Преобразование целых типов в типы с плавающей точкой выполняется по специальным библиотечным процедурам с заполнением свободных битов мантиссы нулями. Так как диапазон представления типов с плавающей точкой намного шире диапазона представления целых типов, такое преобразование всегда дает корректный результат.
Преобразование старших целых типов в младшие целые типы выполняется отбрасыванием старших байтов. Например:
long int ff = 0x12345678; //тип занимает 4 байта
short i; //тип занимает 2 байта
i=ff;
printf("%x %x \n", ff, i); //получим в 16-ичной с/с: 12345678 5678
Преобразование более старшего типа с плавающей точкой в младший тип с плавающей точкой (например, long double в float) выполняется по специальным библиотечным процедурам округлением числа до нужного количества знаков после десятичной точки.
Преобразование типа с плавающей точкой в целый тип выполняется по специальным библиотечным процедурам и дает ближайшее целое число. Результат корректен только тогда, когда целая часть преобразуемого числа с плавающей точкой помещается в диапазон представления для данного целого типа. Например:
long int li;
double df = 1.5e8;
li = df; // li дает корректное значение 150 000 000
Если df = 1.5e20, то значение li выходит за диапазон значений его типа и в этом случае будет неправильное.
Явное преобразование типа называют приведением и выполняют с помощью операции приведения типа, формат которой выглядит таким образом:
§ синтаксис С:
результат = (требуемый_тип) аргумент;
результат = требуемый_тип (аргумент);
§ синтаксис С++ ( использование дополнительно к синтаксису С операций static_ cast, reinterpret_cast, dynamic_cast,const_cast):
результат = static_cast <требуемый_тип> (аргумент);
результат = reinterpret_cast <требуемый_тип> (аргумент);
результат = dynamic_cast <требуемый_тип*> (аргумент);
результат = const_cast <требуемый_тип> (аргумент);
Оператор static_cast <тип> (выражение) предназначен для выполнения операций приведения типов над объектами неполиморфных классов. Например, его можно использовать для приведения типа указателя базового класса к типу указателя производного класса. Кроме того, он подойдет и для выполнения любой стандартной операции преобразования, но только не в динамическом режиме (т.е. не во время выполнения программы).
Оператор reinterpret_cast <тип> (выражение) позволяет преобразовать указатель одного типа в указатель совершенно другого типа. Он также позволяет приводить указатель к типу целого и целое к типу указателя.
Оператор dynamic_cast <тип*> (выражение) реализует приведение типов в динамическом режиме, что позволяет контролировать правильность этой операции во время работы программы. Основное его назначение – реализация операции приведения полиморфных типов.
Оператор const_cast <тип> (выражение) используется при выполнении операции приведения типов для явной подмены атрибутов const (постоянный) и/или volatile (переменный). Обычно с помощью оператора const_cast значение лишают атрибута const.
Результатом операции является значение заданного типа. Часто явное преобразование типа является источником возможных ошибок, поскольку вся ответственность за его результат возлагается на программиста. Тем не менее, в ряде случаев приведение типа может быть просто необходимо. Рассмотрите примеры, приведенные ниже.
В С++ используются такие инструменты как динамическая идентификация типа и более совершенные операторы приведения типов. Динамическая идентификация типа дает возможность определить тип объекта не на этапе компиляции, а во время выполнения программы. Новые операторы приведения типов предоставляют более безопасные и управляемые способы выполнения операций приведения типов, по сравнению с существовавшими ранее.
Информация о типе объекта, как правило, становится известной во время компиляции программы. С появлением ООП, в языках, поддерживающих полиморфизм, во время выполнения программы возможны ситуации, в которых тип объекта на этапе компиляции неизвестен, поскольку точная природа объекта не определена до выполнения программы. Так как полиморфизм реализуется через иерархии классов, виртуальные функции и указатели базовых классов (это достаточно сложно, и об этом мы будем говорить во втором семестре), то указатель базового класса может использоваться для указания на объект базового класса, либо для указания на объект любого класса, производного от базового. Следовательно, не всегда есть возможность заранее узнать тип объекта, на который будет указывать указатель базового класса в каждый момент времени. В таких случаях определение типа объекта должно происходить во время выполнения программы, и для этого служит механизм динамической идентификации типов: оператор typeid (объект). При использовании формы оператора typeid (имя_типа) получем объект типа type_info, который можно использовать в инструкции для сравнения типов. Для использования оператора typeid в программу следует включить заголовок <typeinfo>.
Дата добавления: 2015-07-08; просмотров: 281 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Пример 6. | | | Примеры преобразования типов |