преобразование long в int

 

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

например функция ChartGetInteger возвращает значение типа long, а использовать мне его нужно в функции с входным параметром int.

 
Александр:

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

например функция ChartGetInteger возвращает значение типа long, а использовать мне его нужно в функции с входным параметром int.

https://www.mql5.com/ru/docs/basis/types/casting

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Часто возникает необходимость преобразовать один числовой тип в другой. Не каждый числовой тип допустимо преобразовать в другой, допустимые преобразования в MQL5 показаны на схеме: Сплошные линии со стрелками обозначают преобразования, которые выполняются без потери информации. Вместо типа char может выступать тип bool (оба занимают в памяти 1...
 
long long_y = 12345;
int y;
y = (int)long_y;
 
Sergey Kolemanov:

https://www.mql5.com/ru/docs/basis/types/casting

ответ "это невозможно" меня не устраивает.

еще есть мысли?

 
Александр:

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

например функция ChartGetInteger возвращает значение типа long, а использовать мне его нужно в функции с входным параметром int.

лучше изменить входной параметр функции int на long.
Компилятор же не знает, вдруг ваша переменная long будет больше INT_MAX (2147483647) или меньше INT_MIN (-2147483648)

 
Igor Makanu:
Спасибо!
 
Александр:

ответ "это невозможно" меня не устраивает.

еще есть мысли?

Где там написано что "это невозможно" в Вашем случае? Вам дали ссылку, где не только много буковок, но есть и примеры как привести к нужному типу.

 
Sergey Kolemanov:

Где там написано что "это невозможно" в Вашем случае? Вам дали ссылку, где не только много буковок, но есть и примеры как привести к нужному типу.

Вы правы Сергей. До примеров не дочитал.

Вам тоже спасибо!

 
Не забывайте, что если long>INT_MAX(<INT_MIN), то на выходе вы получите неопределенное значение.
 
Здесь, на мой взгляд, всё очевидно. Переменная типа int занимает 2 байта, а переменная типа long занимает 4 байта. Понятно, что если в long-переменной записано слишком большое по модулю значение, что при преобразовании long=>int произойдёт некорректность. Будьте к этому готовы, проверяйте перед преобразованием. Вот и всё.
 

Вообще важно понимать, что:

uint a = 0;
int i = 10;
for (;  i >= 10;  ++ i) {
   ++ a;
}
Alert(a);

при компиляции с оптимизацией, gcc уходит в бесконечный цикл, clang выдаёт 4294967287, мкл выдаёт 2147483638. И самое интересное то, что каждый из них прав :)

Причина обращения: