代码是这样的:
新开两个指针:
long *p1=new long;
long *p2=new long;
其中:
*p1=-100000;
*p2=100000;
后面进行计算的时候,
long long res=*p1*(*p2);
得到的结果是:
res=-1410065408
显然,这里*p1被隐式转换成了long,然后两个long相乘,结果溢出了。
正确的结果是:
res=-1E10
在C++ primer第156页讲过,数组会隐式转换为指向第一个元素的指针。
所以,C++将“指向new开辟的动态内存的”指针隐式转换为了long类型。
但是long只有32位。这里会溢出。
所以一种方法是先强制转换:
res=(long long)(*p1)*(long long)(*p2);
当然更好的方法是,把long long定义为int64。
然后开辟64位的存储空间:
int64 *p1=new int64;
int64 *p2=new int64;
int64 res=*p1*(*p2);
完毕。