C 是否仍然将两个 `int` 的乘积转换为相同大小的 `int`?

rob*_*son -1 c types casting

如果有人能给我指点权威参考文献(我很难找到),我将不胜感激。

在古代:

int32_t a, b;
int64_t c;
c = a*b;
Run Code Online (Sandbox Code Playgroud)

这段代码没有做我想要的,因为结果a*b仍然是一个 32 位字,它被符号扩展到 64 位c. 我知道我可以在乘法之前转换ab转换int64_t为,但这是在深度嵌套的 DSP 算法中,我不想浪费执行符号扩展的机器指令,我不希望机器执行 64x64乘。

在现代 C 编译器中执行此操作的正确且有效的方法是什么?

Eri*_*hil 5

C 2018 6.5.5 讨论了乘法运算符,其第 3 段说“通常的算术转换是在操作数上执行的。”

6.3.1.8 规定了通常的算术转换。它的第二句话说“目的是为操作数结果确定一个共同的实数类型”(原文斜体,加粗)。接下来是指定结果类型的规则。对于等级不低于 的操作数(实际上意味着它们不小于),这种类型是。因此,无论它被分配给什么,都会产生一个结果。int32_tintintint32_ta*bint32_t

如果您编写c = (int64_t) a * b,编译器可能会认识到强制转换对aor的值没有影响,b但结果将是 64 位,因此如果目标体系结构有一个(或多个指令达到相同的效果)。但是,这不是 C 标准所要求的,而是取决于编译器。