#include <iostream>
int main()
{
int number=65536;
long long temp=number*number;
std::cout << temp << std::endl;
return 0;
}
65536
的平方明显超出int
的范围。现在,如果我已将temp
声明为int
,我会理解为什么会失败。但即使它是long long
,输出也总是0
。我相信这与隐式类型转换有些相关,但我无法理解为什么结果是0
。
这是因为c ++根本不允许将int
转换为long
吗?如果是这样,那为什么这个数字较小?
答案 0 :(得分:10)
(请注意,int
的范围可以小到-32767到+32767。)
number * number
在int
算术中计算,因为两个参数都是int
类型。由于int
溢出,您的程序行为未定义。
您希望将结果分配给long long
这一事实无关紧要。
一种解决方案是编写1LL * number * number
以强制推广long long
类型的参数。
答案 1 :(得分:3)
用于操作的类型取决于该操作使用的操作数。
在操作number*number
中,两个操作数均为int
。它们不是小整数类型,它们都是相同的类型,因此不会有隐式提升。乘法将在int
类型上执行,结果将为int
类型。
之后您碰巧将结果分配给long
并不会影响计算。
解决方案是将一个或两个操作数强制转换为足以保存计算结果的类型。
答案 2 :(得分:2)
编译器将乘法视为两个int
变量之间的乘法。该乘法的结果转换为long long
以初始化temp
变量。
乘法的至少一个操作数需要为long long
才能发生溢出。