如何仅使用整数数据类型进行计算?
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);
我正在尝试使用 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);