Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Правила преобразования типов

Читайте также:
  1. A. Различаем правила и стратегии.
  2. AT СТАЦИОНАРНАЯ И AT ОПЕРАТИВНАЯ. ПОЗЫ AT. ПРАВИЛА ВЫПОЛНЕНИЯ AT
  3. III. ПРАВИЛА ВЫПОЛНЕНИЯ ПРЫЖКОВ С ПАРАШЮТОМ.
  4. LI. Правила действий воздушного судна-перехватчика и воздушного судна-нарушителя
  5. V. ПРАВИЛА ПРОВЕДЕНИЯ СОРЕВНОВАНИЯ
  6. VI. Общие требования и правила полетов
  7. VI. ПРАВИЛА ПРИЗЕМЛЕНИЯ. МЕРЫ ПО ПРЕДУПРЕЖДЕНИЮ ТРАВМАТИЗМА.

 

Преобразование типов в арифметических выражениях:

битовое_поле – сохраняет то же значение;
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.| Примеры преобразования типов

mybiblioteka.su - 2015-2024 год. (0.008 сек.)