超过限制时输入铸件

时间:2013-08-10 11:33:51

标签: c++ c casting type-conversion

我想将两个int数相乘,为了防止超过int限制(2147483647),结果将保存在long long变量中。所以,我尝试这段代码:

int a, b;
long long result = a * b;

它不起作用!如果a=50000b=50000那么result=-1794967296

因此,我必须将类型转换应用于ab

int a, b;
long long result = (long long)a * (long long)b;

为什么在这种情况下需要应用类型转换?

注意:我不想更改ab的数据类型,我需要将其保留为int

4 个答案:

答案 0 :(得分:7)

由于abint,因此他们的产品a*b也是int。但是产品太大而且溢出而且你得到了一个不正确的值。需要强制转换,以便产品也是long long

顺便说一下,你不需要转换两个操作数。只要一个就足够了:

long long result = a * (long long)b;

另一个升级也是long long。请参阅this online demo

顺便说一句,更喜欢C ++风格的演员阵容:

long long result = a * static_cast<long long>(b);

希望有所帮助。

答案 1 :(得分:3)

在像a * b这样的算术表达式中,编译器会查看参数的类型并执行相应的操作。在这种情况下,ab都具有类型int,因此编译器会将两个int值相乘,从而生成类型为int的结果。

要以更高的精度进行计算,一个或两个参数必须具有该精度。因此,您需要将ab(或两者)更改为long long,以便让编译器生成将两个long long值相乘的代码。

答案 2 :(得分:2)

因为int * int乘法的结果是int本身,所以结果是一个int,然后转换为long long但溢出已经发生。

但是如果你在乘法之前(或只是其中一个)将a和b变量强制转换为long long,则结果为long long。 记住:

int * int --> int 
long long * long long --> long long
long long * int --> long long

答案 3 :(得分:2)

您无需同时投放ab。只需a即可。

认为你是编译器而且你被问到: 取两件事,combine他们和place他们在那里。

这是两条说明:combineplace。 而第二个不应该关心第一个 如果你使用像C这样的快速语言。

combine关心它的用途是什么帮助你 结合。现在你只需要清楚地陈述并投射 long long的其中一个操作数。

您可能认为place可能更聪明,而且它 实际上应该更聪明,但也应该有 一个明确的限制,它应该是多么聪明, 否则我们从Space Odyssey 2001获得那个故事:)。