prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 3.14

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 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管