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

C是否仍然将两个int的乘积转换为相同大小的int?,c,types,casting,C,Types,Casting,如果有人能给我提供一份权威的参考资料(我很难找到),我将不胜感激 在过去: int32_t a, b; int64_t c; c = a*b; 这段代码没有达到我想要的效果,因为a*b的结果仍然是一个32位字,它被符号扩展为64位c。我知道我可以在乘法之前将a或b转换为int64\u t,但这是一种深度嵌套的DSP算法,我不想浪费符号扩展的机器指令,也不想让机器执行64x64乘法 在现代C编译器中,如何正确有效地执行此操作?C 2018 6.5.5讨论了乘法运算符,其第3段说“通常的算术转换是

如果有人能给我提供一份权威的参考资料(我很难找到),我将不胜感激

在过去:

int32_t a, b;
int64_t c;
c = a*b;
这段代码没有达到我想要的效果,因为
a*b
的结果仍然是一个32位字,它被符号扩展为64位
c
。我知道我可以在乘法之前将
a
b
转换为
int64\u t
,但这是一种深度嵌套的DSP算法,我不想浪费符号扩展的机器指令,也不想让机器执行64x64乘法


在现代C编译器中,如何正确有效地执行此操作?

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

6.3.1.8规定了常用的算术转换。它的第二句话是“目的是确定操作数结果的通用实数类型”(原文为斜体,加了粗体)。然后是指定结果类型的规则。对于秩不低于
int
int32\u t
操作数(实际上意味着它们不小于
int
),此类型为
int32\u t
。因此,
a*b
产生一个
int32\t
结果,而不管它被分配到什么


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

您的愿望似乎有冲突:您希望
a*b
是64位表达式,但不希望乘法是64位的@JaMiT:乘法不必是32×32→32或64×64→64有些处理器具有32×32的带宽→64指令。挑战在于让C编译器使用它。C确实没有一种内置的方法来进行乘法运算。如果您编写
c=(int64_t)a*b
,编译器可能会意识到可以使用加宽乘法(如果您的计算机有),或者可能不会。例如,x86-32上的gcc有,而x86-64上没有。您的机器可能有不可移植的内部函数来访问一个文件;否则,如果内联asm很关键,就只能使用内联asm。如果编译器足够聪明,则添加强制转换不应发出符号扩展指令。如果您考虑的是特定的体系结构/编译器,可能会有人建议如何诱使编译器执行您想要的操作//因此编译器可能会使用32×32→64乘法指令,如果目标体系结构有一条(或多条相同效果的指令)。但是,这不是C标准所要求的,这取决于编译器。//是的,这就是问题所在。我只是希望我可以编写干净的、可移植的通用C代码来处理DSP,而不需要使用pragma或其他东西来让编译器完全按照我的要求来做。