1

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

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

不起作用!如果a=50000然后。b=50000_result=-1794967296

因此,我必须对aand应用类型转换b

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

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

注意:我不想更改 and 的数据类型ab我需要将它们保留为int.

4

4 回答 4

7

由于abint,他们的产品a*b也是int。但是产品太大以至于它溢出并且你得到一个不正确的值。需要演员表以便产品也是long long

顺便说一句,您不需要同时转换两个操作数。一个就够了:

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

另一位晋升long long也。请参阅此在线演示

顺便说一句,比起 C 风格的演员表,更喜欢 C++ 风格的演员表:

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

希望有帮助。

于 2013-08-10T11:35:04.047 回答
3

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

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

于 2013-08-10T11:36:52.327 回答
2

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

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

int * int --> int 
long long * long long --> long long
long long * int --> long long
于 2013-08-10T11:38:11.380 回答
2

您不需要同时投射ab。就够a了。

想想你是编译器,你被问到:拿两件事,combine他们和place他们在那里。

这是两条指令:combineplace. 如果您使用的是快速的语言,第二个不应该关心第一个C

对你有帮助的是combine关心它结合了什么。现在您只需要清楚地说明它并将其中一个操作数转换为long long.

你可能会认为它place可能更聪明,实际上它应该更聪明,但它应该有多聪明也应该有一个明确定义的限制,否则我们会从 Space Odyssey 2001 中得到这个故事:)。

于 2013-08-10T11:43:28.223 回答