我可以使用变量范围之外的值进行计算吗?

eph*_*ule 7 c range uint8t

我正在用 C 进行编码,我知道可以存储在uint8_t0 到 255 范围内的值。我想存储一个 的百分比值MAX_INTENSITY,声明为: #define MAX_INTENSITY 200

我可以执行以下操作吗: uint8_t my_intensity = (MAX_INTENSITY * percentage) / 100;

结果将是200 或更小,但在计算过程中,中间结果可以优于255,例如percentage = 50MAX_INTENSITY * percentage= 10'000。即使最终结果是 100, o 在 a 范围内,这会导致问题吗uint8_t

chq*_*lie 2

在 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此局部变量的类型,因为在此上下文中使用较小的类型键入它没有任何好处。