c - 使用两个整数接收操作的长值 (GNU C)

标签 c casting int overflow long-integer

使用 Microchip C 编译器(基于 Gnu C 编译器),我需要处理两个整数值并返回一个整数值。整数是 16 位宽,长整数是 32 位。

在计算过程中,会超出16bit的范围。这是我到目前为止所做的:

unsigned int calcVoltage(unsigned int adcValue){
    long voltage = ((long)adcValue * (long)VOLTAGE) / (long)ADCRANGE;
    return voltage; //12-bit ADC-Value, 3000mv max
}

VOLTAGE 是一个常量,此时赋值为 3000。 adcValue(0 到 12bit)乘以 3000 将超过 16bit。最后乘法的结果要除以4095,结果又会小于16bit。

IMO,我的代码非常丑陋,因为我不知道如何做得更好。我如何确保编译器在计算期间使用 32 位长整数而不进行所有显式转换?

最佳答案

如果您正确定义了 VOLTAGE,则由于通常的转换规则,其余部分就位。

#define VOLTAGE 3000L

long voltage = (adcValue * VOLTAGE) / ADCRANGE;

仅此而已。

为什么,你问?因为当编译器计算出如何处理乘法时,它必须将 long (VOLTAGE) 乘以 int (adcValue ),它必须这样做的方法是将 int 提升为 long,从而产生 long 结果。现在计算除法时,它在 LHS(股息)上有一个 long,在 RHS(除数)上有一个 int,因此它必须转换 int 再次转换为 long,作为 long 进行计算,产生 long。然后它必须处理分配。 LHS 是一个long; RHS 上的表达式是一个long;世界是一个快乐的地方(代码是干净的,没有城堡)。

关于c - 使用两个整数接收操作的长值 (GNU C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18302300/

相关文章:

c - Valgrind 错误 : conditional jump or move depends on uninitialised value(s) - C

c - C中的频率分析,如何获取数组中的整个ascii表?

java - 如何在 Java 中的 equals 覆盖方法中强制转换对象?

python - 仅反转列表中的整数,无需切片或反向()

c - 不同的语言如何在其标准库中实现排序?

奇怪的数组覆盖

MySQL castr 运算符

c# - 为什么必须在三元表达式中强制转换int类型?

c - 为什么 strchr 需要一个 int 来查找 char?

python - NumPy 或 Pandas : Keeping array type as integer while having a NaN value