Если я сделаю вычисление с переменной, где промежуточная часть вычисления будет выше границ этого типа переменной, есть ли опасность, которая может не понравиться некоторым платформам?
Это пример того, что я спрашиваю:
int a, b;
a=30000;
b=(a*32000)/32767;
Я скомпилировал это, и он дает правильный ответ 29297 (ну, в любом случае, с усеченной ошибкой). Но меня беспокоит то, что 30 000 * 32 000 = 960 000 000, то есть 30-битное число, и, следовательно, не может быть сохранено в 16-битном целом. Конечный результат находится в пределах int, но я ожидал, что любая рабочая часть памяти будет иметь такой же размер, как и самые большие исходные переменные, поэтому возникнет ошибка переполнения.
Это лишь небольшой пример, демонстрирующий мою проблему. Я стараюсь избегать использования чисел с плавающей запятой, делая дробь дробной частью максимального количества, которое можно сохранить в этой переменной (в данном случае целое число со знаком, 32767 с положительной стороны), потому что я использую встроенную систему, я считаю, не имеет FPU.
Так как большинство процессоров обрабатывают вычисления вне границ исходной и целевой переменных?