如果有人能给我指点权威参考文献(我很难找到),我将不胜感激。
在古代:
int32_t a, b;
int64_t c;
c = a*b;
Run Code Online (Sandbox Code Playgroud)
这段代码没有做我想要的,因为结果a*b仍然是一个 32 位字,它被符号扩展到 64 位c. 我知道我可以在乘法之前转换a或b转换int64_t为,但这是在深度嵌套的 DSP 算法中,我不想浪费执行符号扩展的机器指令,我不希望机器执行 64x64乘。
在现代 C 编译器中执行此操作的正确且有效的方法是什么?
C 2018 6.5.5 讨论了乘法运算符,其第 3 段说“通常的算术转换是在操作数上执行的。”
6.3.1.8 规定了通常的算术转换。它的第二句话说“目的是为操作数和结果确定一个共同的实数类型”(原文斜体,加粗)。接下来是指定结果类型的规则。对于等级不低于 的操作数(实际上意味着它们不小于),这种类型是。因此,无论它被分配给什么,都会产生一个结果。int32_tintintint32_ta*bint32_t
如果您编写c = (int64_t) a * b,编译器可能会认识到强制转换对aor的值没有影响,b但结果将是 64 位,因此如果目标体系结构有一个(或多个指令达到相同的效果)。但是,这不是 C 标准所要求的,而是取决于编译器。
| 归档时间: |
|
| 查看次数: |
83 次 |
| 最近记录: |