В том случае, если в одном выражении используются различные типы данных, то CTRL всегда пытается преобразовать их в общий или ожидаемый тип.
ВНИМАНИЕ
Без применения явного преобразования типа действия CTRL по преобразованию типов могут приводить к непредсказуемым результатам!
Явное преобразование типа
Оператор приведения типа используется для явного приведения (преобразования) типа данных. Оператор приведения типа указывается непосредственно перед выражением, тип результата которого необходимо преобразовать:
——> Оператор приведения типа —>Выражение —>
Значение выражения преобразуется в тип, задаваемый оператором приведения типа.
string s1 = «123»;
float f1 = 12.345;
// Тип данных результата выражения «s1+f1» не может быть предсказан заранее, поскольку
// возможно либо преобразование значения «s1» в число с плавающей точкой, либо преобразование значения «f1» в строку (т.е. результатом может быть либо конкатенация строк «12312.345», либо сумма двух чисел, равная 135.345)
s1 + f1
// Ниже «f1» преобразуется в строку и добавляется к «s1»
s1 + (string)f1;
Преобразование в тип «string»
При присваивании значения «простого» типа данных строковой переменной, к значению автоматически применяется функция sprintf() с минимальным количеством спецификаторов. Строковая переменная содержит результат данной операции. При преобразовании типа «bit32» к строковому возвращается строка, состоящая из соответствующих символов ‘0’ — ‘1’.
ПРИМЕР:
string bucket;
char contents = «a»;
bucket = 3.14;
// Переменная bucket содержит значение «3.14», которое представляет собой набор символов, а не число!
bucket = contents;
// bucket содержит значение «a»
ПРИМЕЧАНИЕ
При преобразовании типа «DpIdentifier» неизвестной точки данных в строку возвращается номер «DpIdentifier».
Преобразование строкового значения в другой тип
Строка легко преобразуется в типы «int», «unsigned» или «float». При преобразовании в тип «float» необходимо проверить региональные настройки формата для числовых значений. В разных странах в качестве разделителя целой и дробной частей используются различные символы. В том случае, если строковое значение присваивается переменной типа «32bit», то каждая «1» в строке устанавливает соответствующий бит в переменной типа 32bit, а каждый «0» — сбрасывает соответствующий бит. Другие символы в строке не вызывают никаких изменений в соответствующем бите.
- string s = «00000011111100000011111100000011»;
bit32 b = s;
Значение переменной «s» записывается в переменную «b» типа «bit32».
Строки, содержащие значения байтов в шестнадцатеричном представлении, могут быть присвоены переменным типа «blob».
ПРИМЕР:
- string s = «FFAB003A»;
blob b = s;
В результате выполнения вышеуказанных операторов переменная «b» будет содержать 4 байта с шестнадцатеричными значениями FF, AB, 00 и 3A.
В примере выше строка также может иметь следующий формат:
- string s = «FF,AB,00,3A»;
Преобразование значения с типом time в другой тип
Значения типа «time» обрабатываются особым образом. Переменные типа «time» могут неявно приводиться к типу «string» и наоборот. «Неявное» приведение означает преобразование типов без использования соответствующего оператора. Форматы отображения значений времени: (также допускается двузначное представление года, например, «16» вместо «2016»)
- [[ГГ]ГГ.ММ.ДД] ЧЧ[:ММ[:СС[.мсек]]]
Обязательным является указание часа (0-24 час). Части, отведённые под дату и время, отделяются друг от друга пробелом. При отсутствии даты по умолчанию будет взята дата 01.01.1970 г.
ПРИМЕР:
time zerohoursten;
string tstring;
zerohoursten = «00:10»;
/* Переменная zerohoursten типа time инициализирована строкой «00:10». */
tstring = zerohoursten;
/* tstring содержит значение «1970.01.01 00:10:00.000» */
При преобразовании переменной типа «time» с двузначным представлением года, значение < 70 интерпретируется как год 21-го века (20xx), а значение >70 интерпретируется как год 20-го века (19хх).
ПРИМЕР:
main()
{
time t1, t2;
t1 = «98.1.1»; // Переменной t1 присвоено значение 1 января 1998
t2 = «29.10.11»; // Переменной t2 присвоено значение 11 октября 2029
DebugN(t1, t2);
}
В том случае, если строковая переменная имеет значение «now», то она преобразуется в текущее время.
Преобразование типов int, unsigned и float в тип time
Значения c типами «int», «unsigned» и «float» могут присваиваться переменным с типом «time». Значения типов «int» или «unsigned», а также целая часть значения с типом «float» преобразуются в секунды, а дробная часть рассматривается как миллисекунды.
ПРИМЕР:
time t1, t2;
t1 = «2000.01.01 12:00:00»;
//…
t1 -= 3600;
// Значение t1 уменьшено на один час один час
t2 += 1.003;
// Значение t2 увеличено на 1003 миллисекунды