为什么以下代码没有给出所需的答案?

时间:2011-02-17 12:29:45

标签: c++ c int

昨天接受采访时,面试官问我一个问题:

为什么以下代码没有给出所需的答案?

int a = 100000, b = 100000;

long int c = a * b ;

语言为C.

我告诉采访者我们首先计算100,000 * 100,000作为int(溢出),然后将其投入很长时间。

3 个答案:

答案 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*1000001000000000010,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位。