Q为什么代码
int a = 1000, b = 1000; long int c = a * b;的函数调用是否会工作?
A在 C 的整型提升规则下,乘法是以int算术进行的,其结果在被提升并赋值给左侧的long int之前可能会发生溢出或截断。使用显式类型转换至少其中一个操作数来强制进行 long 算术
long int c = (long int)a * b;或者也许
long int c = (long int)a * (long int)b;(这两种形式是等价的)。
请注意,表达式(long int)(a * b)不会 产生预期的效果。这种形式的显式类型转换(即应用于乘法结果)等同于将值赋给左侧时发生的隐式转换,并且与隐式转换一样,它发生得太晚了,已经造成了损害。long int左侧,并且与隐式转换一样,它发生得太晚了,已经造成了损害。
另请参阅问题 3.15。
参考:K&R1 第 2.7 节,第 41 页
K&R2 第 2.7 节,第 44 页
ISO 第 6.2.1.5 节
H&S 第 6.3.4 节,第 176 页
CT&P 第 3.9 节,第 49-50 页