假设这些是您一直用于此计算的值,那么我会执行以下操作:
D = I / (65535 / C);
或者
D = I / 4369;
因为 C 是 65535 的因数。这将有助于减少超出可用整数范围的可能性(即,如果您只有 16 位无符号整数)。
在更一般的情况下,如果您认为 I 和 C 的乘法可能会导致您使用的整数类型的允许范围之外的值(即使最终结果将在该范围内),您可以将分子和分母的GCD 分解为:
INT I = 41828;
INT C = 15;
INT DEN = 65535;
INT GCDI = GCD(I, DEN);
DEN = DEN / GCDI;
I = I / GCDI;
INT GCDC = GCD(C, DEN);
DEN = DEN / GCDC;
C = C / GCDC;
INT D = (I * C) / DEN;
其中 DEN 是您的分母(在本例中为 65535)。这不会在所有情况下为您提供正确的答案,特别是如果 I 和 C 都与 DEN 互质且 I*C > MAX_INT 时。
至于你提出的更大的问题,整数值的除法总是会丢失小数部分(相当于 floor 函数)。保留我们认为的“小数”部分中包含的信息的唯一方法是通过可以从模数导出的余数。我强烈建议您不要混淆这些不同数字系统的含义。整数就是整数。如果你需要它们是浮点数,你真的应该使用浮点数,而不是整数。如果您感兴趣的只是向用户显示小数部分(即您并没有真正使用它进行进一步计算),那么您可以编写一个例程将余数转换为表示余数的字符串。