昨天接受采访时,面试官问我一个问题:
为什么以下代码没有给出所需的答案?
int a = 100000, b = 100000;
long int c = a * b ;
语言为C.
我告诉采访者我们首先计算100,000 * 100,000作为int(溢出),然后将其投入很长时间。
答案 0 :(得分:5)
这是因为它首先将它计算为int,然后才将其转换为long变量。(因此它首先溢出为整数然后变为long) 代码应该是
long int c = a*(long int)b;
答案 1 :(得分:5)
我猜测线索会发生integer overflow,但是如果值很低,我就不会发现这种情况。
int(通常为32位)的最大(正)值为: 2,147,483,647
您的计算结果是: 100,000,000
更新:
使用您更新的问题:100000 * 100000
代替10000 * 10000
导致 10,000,000,000 ,将导致溢出。然后将该值转换为很长时间。
为了防止这种溢出,正确的方法是将乘法中的两个值之一转换为long(通常为64位)。例如。 (long)100000 * 100000
答案 2 :(得分:3)
100000*100000
是10000000000
(10,000,000,000
),大于32位int
可以表示的最大值(2,147,483,647
),因此它{{3} }}
a*b
仍然是int
,它不是long int
,因为表达式a*b
的成员都属于int
类型,因此它们不是'{1}}转换为long int
:此转化仅在评估a*b
后才会发生,此时结果已分配c
。如果您希望a*b
的结果为long int
,则需要将至少一个操作数转换为long int
:
long int c = (long int)a * (long int)b.
此外long int
可以与int
大小相同(也可以用32位表示):这很可能发生在32位应用程序中,通常{{1} }。
如果您需要sizeof(int) == sizeof(long int) == 4
为64位,则最好使用overflows之类的变量,以确保您具有64位。