преобразование long в int - страница 2

 
Victor Ziborov:
Здесь, на мой взгляд, всё очевидно. Переменная типа int занимает 2 байта, а переменная типа long занимает 4 байта. Понятно, что если в long-переменной записано слишком большое по модулю значение, что при преобразовании long=>int произойдёт некорректность. Будьте к этому готовы, проверяйте перед преобразованием. Вот и всё.
Только 4 и 8 байт.
 

Кстати, тут не всё так просто с целочисленными конверсиями. Если раньше поведение зависило от реализации:

int i;
i = INT_MAX;
short s = i;  // implementation-defined
Alert(s);

то начиная с С++20 правило примерно такое: если тип-приёмник(s) меньше источника(i), то в приёмник попадает i % 2^n, где n - количество бит в приёмнике. Т.е. 2147483647 % 2^16 = 65535 = short(-1).

В мкл поведение соответствует этому правилу.

ЗЫ: Возможно, я там кого-нибудь в заблуждение ввёл, когда написал short(-1), это должно быть справедливо лишь для two's complement систем, поэтому такой подход неверен. Хотя какую-нибудь one's complement никогда не встречал, не знаю где такие водятся.
Причина обращения: