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



(https://msdn.microsoft.com/ru-ru/library/aetzh118.aspx)

 

Неявное преобразование.

Список типов операндов для неявного преобразования:

 

Long double                  4. unsigned long long                  7. long

Double                           5. long long                                  8. unsigned int

Float                              6. unsigned long                          9. int

 

Операнды других типов char, signed char, unsigned char, short или unsigned short преобразуются перед операцией как минимум в тип int.

 

Таблица 2.2. Условия для неявного преобразования типов

Выполненные условия Преобразование
Один из операндов является операндом типа long double: другой операнд преобразуется в тип long double.
Предыдущее условие не выполнено и один из операндов является операндом типа double: другой операнд преобразуется в тип double.
Предыдущие условия не выполнены и один из операндов является операндом типа float: другой операнд преобразуется в тип float.
Предыдущие условия не выполнены (ни один из операндов не является операндом с плавающей запятой): для операндов выполняются восходящие приведения целого типа следующим образом.
Если один из операндов имеет тип unsigned long: другой операнд преобразуется в тип unsigned long.
Если предыдущее условие не выполнено и один из операндов имеет тип long, а другой – тип unsigned int: оба операнда преобразуются в тип unsigned long.
Если два предыдущих условия не выполнены и один из операндов имеет тип long: другой операнд преобразуется в тип long.
Если три предыдущих условия не выполнены и один из операндов имеет тип unsigned int: другой операнд преобразуется в тип unsigned int.
Если ни одно из предыдущих условий не выполнены: оба операнда преобразуются в тип int.

 

Правила преобразования (таблица 2.2) продемонстрируем на примере:

 

int iVal = 7;

unsigned long ulVal = 11;

float fVal = 12.3f; // Присвоение константы типа float.

double dVal;

// Значение iVal преобразуется в unsigned long,

// результат умножения преобразуется в double.

dVal = iVal * ulVal; // dVal = 77.0

// Значение ulVal преобразуется в float,

// результат сложения преобразуется в double.

dVal = ulVal + fVal; // dVal = 89.3

 

Примеры получения неожиданных результатов при неявном преобразовании значений:

 

short s = -3;

unsigned short us = s; // Значение s преобразуется в тип unsigned short

System::Console::WriteLine("us = {0}", us); // us = 65533

s = us;           // Значение us преобразуется в тип signed short

System::Console::WriteLine("s = {0}", s);  // s = -3

int i = 20;

unsigned int ui = 10;

System::Console::WriteLine("ui-i = {0}", ui-i); // ui-i = 4294967286,

Т.к. именно i преобразуется в тип unsigned int

 

Явное преобразование.

Примеры явного преобразования (приведения) типов:

 

int i;

double d = 3.2;

i = (int) d; // Явное преобразование с потерей дробной части

 

В новом стиле для преобразования значения выражения к определенному типу, используется следующий синтаксис.

 

static_cast<новый_тип>(выражение)

 

Например:

 

double value1 = 7.7;

double value2 = 3.2;

int number = static_cast<int>(value1) + static_cast<int>(value2);

// number = 10 (сумма целых частей переменных value1 и value2)

 

Методы преобразования типов класса System::Convert

 

Таблица 2.3. Основные методы класса System::Convert
(http://msdn.microsoft.com/ru-ru/library/system.convert_methods.aspx)

Метод Описание
ChangeType(V,T); Возвращает объект (Object) указанного типа (T) и значение которого эквивалентно указанному объекту (V) значение.
FromBase64CharArray (arrCh[],i,L); Преобразует подмножество массива символов Unicode 64-разрядной платформы в эквивалентный массив 8-битовых целых чисел без знака. Параметры метода определяют подмножество входного массива (arrCh) и число преобразуемых элементов (L), начиная с индекса i.
FromBase64String(s); Преобразует указанную строку (s) 64-разрядной платформы в эквивалентный массив 8-битных целых чисел без знака.
IsDBNull(V); Возвращает значение, указывающее, имеет ли заданный объект (V) тип DBNull.
ToBase64CharArray (arrByte[],i1,L, arrCh[],i2); Преобразует подмножество (L элементов, начиная с i1-го) массива 8-битных целых чисел без знака (arrByte) в эквивалентное подмножество (начиная с i2-го элемента) массива символов (arrCh) Unicode 64-разрядной платформы. Возвращает целое число со знаком (Int32), представляющее число байтов в выходном массиве (arrCh).
ToBase64String (arrByte[]); ToBase64String (arrByte[],i,L); Преобразует значения всего или подмножества (L элементов, начиная с i-го) массива 8-битовых целых чисел без знака (arrByte) в эквивалентное строковое представление 64-разрядной платформы.
ToBoolean(V); Преобразует указанное значение (числового типа) в логическое (Boolean). Возвращает true – если V <> 0, и false – если V = 0.
ToByte(V); Преобразует указанное значение в 8-битное целое число без знака (Byte).
ToChar(V); Преобразует указанное значение в символ Unicode (Char).
ToDateTime(V); Преобразует указанное значение в значение даты или времени (DateTime).
ToDecimal(V); Преобразует указанное значение в число типа Decimal.
ToDouble(V); Преобразует указанное значение в вещественное число двойной точности (Double).
ToInt16(V); Преобразует указанное значение в 16-битное целое число (Int16).
ToInt32(V); Преобразует указанное значение в 32-битное целое число (Int32).
ToInt64(V); Преобразует указанное значение в 64-битное целое число (Int64).
ToSByte(V); Преобразует указанное значение в 8-битное целое число (SByte).
ToSingle(V); Преобразует указанное значение в вещественное число одинарной точности (Single).
ToString(V); Преобразует указанное значение в его строковое представление (String).
ToUInt16(V); Преобразует указанное значение в 16-битное целое число без знака (UInt16).
ToUInt32(V); Преобразует указанное значение в 32-битное целое число без знака (UInt32).
ToUInt64(V); Преобразует указанное значение в 64-битное целое число без знака (UInt64).

 

Пример 2.6. Преобразование минимального и максимального значений числовых типов в эквивалентное строковое представление.

 

#include "stdafx.h"

using namespace System;

int main() {

String^ smin = "";

String^ smax = "";

Console::WriteLine("Диапазоны значений числовых типов С++:");

smin = Convert::ToString(double::MinValue); // Преобразование

smax = Convert::ToString(double::MaxValue); // числа в строку.

Console::WriteLine("double: {0} ... {1}", smin, smax);

smin = Convert::ToString(Single::MinValue);

smax = Convert::ToString(Single::MaxValue);

Console::WriteLine("float: {0,-22:R} ... {1}", smin, smax);

smin = Convert::ToString(Int64::MinValue);

smax = Convert::ToString(Int64::MaxValue);

Console::WriteLine("long long: {0,-22:R} ... {1}", smin, smax);

smin = Convert::ToString(int::MinValue);

smax = Convert::ToString(int::MaxValue);

Console::WriteLine("int:  {0,-22:R} ... {1}", smin, smax);

smin = Convert::ToString(short::MinValue);

smax = Convert::ToString(short::MaxValue);

Console::WriteLine("short: {0,-22:R} ... {1}", smin, smax);

smin = Convert::ToString(char::MinValue);

smax = Convert::ToString(char::MaxValue);

Console::WriteLine("char: {0,-22:R} ... {1}", smin, smax);

Console::ReadLine();

return 0;

}

/* Вывод:

Диапазон значений числовых типов C++:

 double : -1,79769313486232Е+308 ... 1,79769313486232Е+308

float : -3,402823Е+38          ... 3,402823Е+38

Long long: -9223372036854775808   ... 9223372036854775807

Int : -2147483648          ... 2147483647

Short    : -32768                 ... 32767

Char : —128              ... 127

*/

 

2.3. Структура программы на C++

 

Обобщенная структура программы на C++ имеет следующий вид:

 

<Подключение заголовочных файлов>

<Подключение пространств имен>

<Объявление глобальных переменных>

<Объявление функций, классов, структур и др.>

int main([int argc, char *argv[]]) {

<Инструкции>


Дата добавления: 2018-04-05; просмотров: 291; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!