我想将两个int
数相乘,为了防止超过int
限制(2147483647),结果将保存在long long
变量中。所以,我尝试这段代码:
int a, b;
long long result = a * b;
和它不起作用!如果a=50000
和b=50000
那么result=-1794967296
。
因此,我必须将类型转换应用于a
和b
:
int a, b;
long long result = (long long)a * (long long)b;
为什么在这种情况下需要应用类型转换?
注意:我不想更改a
和b
的数据类型,我需要将其保留为int
。
答案 0 :(得分:7)
由于a
和b
为int
,因此他们的产品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
这样的算术表达式中,编译器会查看参数的类型并执行相应的操作。在这种情况下,a
和b
都具有类型int
,因此编译器会将两个int
值相乘,从而生成类型为int
的结果。
要以更高的精度进行计算,一个或两个参数必须具有该精度。因此,您需要将a
或b
(或两者)更改为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)
您无需同时投放a
和b
。只需a
即可。
认为你是编译器而且你被问到:
取两件事,combine
他们和place
他们在那里。
这是两条说明:combine
和place
。
而第二个不应该关心第一个
如果你使用像C
这样的快速语言。
combine
关心它的用途是什么帮助你
结合。现在你只需要清楚地陈述并投射
long long
的其中一个操作数。
您可能认为place
可能更聪明,而且它
实际上应该更聪明,但也应该有
一个明确的限制,它应该是多么聪明,
否则我们从Space Odyssey 2001获得那个故事:)。