如何仅使用整数数据类型进行计算?

How can I calculate this using integer data types only?

我正在尝试使用 MPLABX IDE 和 XC8 编译器在 C 语言中为 PIC12 微控制器编写以下程序。我以前既没有编写过微控制器也没有编写过 C,所以我需要考虑一些新的东西。其中之一是使用浮点类型的计算在这些微控制器上效率低下,因此应该避免。为了遵循这一理念,我想知道进行如下计算的最佳实践:

a = b / c * d

其中:

0 =< a =< d,

0 =< b =< c,

0 =< c,

0 =< d

a、b 和 c 是无符号的 16 位整数。 d可以自由选择

我正在寻找清晰易读的源代码和高效的编译代码之间的妥协。

我考虑过重组方程式,但避免一个问题会引入另一个问题:

a = b / c * d

--> b/c 永远为 0。余数丢失。

a = b * d / c

--> b*d 可能产生溢出。

你应该在除法之前做乘法,如果会溢出就使用更大的类型。

a = (int)((long long)b * d / c);

如果您对操作顺序有疑问,可以在括号中加上括号

a = (int)(((long long)b * d) / c);

虽然这是不必要的,因为虽然*/具有相同的优先级,但它们是从左到右解析的。

如果您想对结果进行四舍五入,您可以在除法之前加上(如果乘积为负则减去)除数的一半。

a = (int)(((long long)b * d + (c >> 1)) / c);