Q: 3.14 为什么这个代码不对?

  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 Sec. 2.7 p. 41
K&R2 Sec. 2.7 p. 44
ISO Sec. 6.2.1.5
H&S Sec. 6.3.4 p. 176
CT&P Sec. 3.9 pp. 49-50


(This Chinese translation isn't confirmed by the author, and it isn't for profits.)

Translator : jhlicc@gmai1.c0m
Origin : http://www.c-faq.com/expr/intoverflow1.html