看看下面的输出是多少
#include <iostream>
using namespace std;
int main()
{
long long a = 1024 * 1024 * 1024 * 4 + 1;
cout << a << endl;
return 0;
}
再看看这个
#include <iostream>
using namespace std;
int main()
{
long long a = 1024;
a = a * 1024 * 1024 * 4 + 1;
cout << a << endl;
return 0;
}
是不是很诡异,呵呵,其实道理很简单,就是很普通的溢出,但是,平时可能不会考虑那么多,大部分只是简单的考虑左值是什么类型的,能不能容纳这么大的数据
而在这里,其实是右值在计算后还没有赋值时就先溢出了
一般情况下,若想表示一个4M的数值
可能会写
long long a = 4194304
但是这么写不直观, 也不符合程序员的思维方式
大多都是这么写的
long long a = 1024 * 1024 * 4
可是若原封不动的表示大于2G的数据,那就不行了,因为1024在32位平台是int型,几个int 相乘,还是int,没有隐式的类型提升的机会