Вы должны выполнить умножение перед делением, используя больший тип, если произойдет переполнение.
a = (int)((long long)b * d / c);
Если у вас есть сомнения относительно последовательности операций, вы можете заключить ее в скобки
a = (int)(((long long)b * d) / c);
хотя это и не нужно, потому что хотя *
и /
имеют одинаковый приоритет, они анализируются слева направо.
Если вы хотите округлить результат, вы можете добавить (или вычесть, если отрицательный результатпроизведение) половина делителя до деления.
a = (int)(((long long)b * d + (c >> 1)) / c);