我正在用 C 进行编码,我知道可以存储在uint8_t0 到 255 范围内的值。我想存储一个 的百分比值MAX_INTENSITY,声明为:
#define MAX_INTENSITY 200
我可以执行以下操作吗:
uint8_t my_intensity = (MAX_INTENSITY * percentage) / 100;?
结果将是200 或更小,但在计算过程中,中间结果可以优于255,例如percentage = 50,MAX_INTENSITY * percentage= 10'000。即使最终结果是 100, o 在 a 范围内,这会导致问题吗uint8_t?
在 C 中,确定每个中间计算所用类型的规则有些复杂,但对于您的特定情况来说相当简单:
乘法涉及类型为整数的MAX_INTENSITY * percentage常量和变量。如果 的类型是或更小的类型,例如,则该操作数将经历整数提升为 type ,结果将具有 type ,然后用作除以 的操作数,另一个类型为 的整型常量,因此使用类型和进行计算相同类型的结果。结果将转换为目标 的类型,这是通过取正模 256 来执行的,这是一个完全定义的运算,特别是如果已知在 的范围内。200intpercentagepercentageintuint8_tintint100intintuint8_tpercentage0200
因此,你的定义是正确的:
uint8_t my_intensity = (MAX_INTENSITY * percentage) / 100;
Run Code Online (Sandbox Code Playgroud)
不过,您可能会考虑使用int此局部变量的类型,因为在此上下文中使用较小的类型键入它没有任何好处。