Цитата(Д_М @ Jun 23 2013, 01:01)

После долгих поисков выявил, что когда умножаются два числа int, а частное long, старшие 16 бит частного всегда равны нулю. Когда сделал множителе тоже long всё нормально. Как-то странно. Другие компиляторы наоборот выдают придупреждения, когда разрядность частного не больше, чем разрядность множителей - char/int, или int/long...
1. При умножении чисел частное получиться не может. Частное есть результат деления (делимого на делитель), а результат умножения (сомножителей) называется произведением.
2. Компиляторы выдают предупреждение, когда результат
усекается, когда результат "шире", чем та переменая, в которою его велено засунуть. А ваш случай противопоположный - int-результат спокойно помещается в long-переменную. С чего бы компилятору этим возмущаться? Ведь опасной для расчета потери части результата от этого произойти не может.
3. По законам языка C результат арифметической операции не превышает разрядности самого длинного операнда. Поэтому результат умножени int x int тоже будет получен в разрядной сетке int, даже, если она для него тесна. Иными словами, разрядность произведения зависит только от разрядности сомножителей, но никак не от разярдности переменной, у которою то произведение в последствии кладут. Поэтому для получения long-резултата необходимо хотя бы один из сомножителей привести к типу long, хотя бы явным образом: lres = (long)i1 * i2
4. Таких проблем нет, когда разрядность int равна разрядности long. Именно это случай имеет место при компиляции 32-разрядных приложений под x86.