要特别注意数据是否溢出,另外,int是16位,long是32位,而long long才是64位int
2015-10-28 15:46
267 查看
代码是这样的:
新开两个指针:
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);
完毕。
新开两个指针:
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);
完毕。
相关文章推荐
- 如何正确挑选优质DC插座
- 部署LyncServer2013之一 前期准备
- 王团结:七牛是如何搞定每天500亿条日志的
- MySQL 5.6 & 5.7最优配置文件模板
- DOM操作style样式——<link>、<style>、<p style=''>的区别
- ios微信自动播放音乐
- RSA的傻瓜原理
- C#3.0新特性之扩展方法介绍
- BZOJ 1853 [Scoi2010]幸运数字 (容斥原理)
- Win7上安装32位Oracle客户端错误解决方法:[INS-30131] 执行安装程序验证所需的初始设置失败
- Android小记:EditText的两个常用属性
- leetcode 260 : Single Number III
- Python的表达式与运算符19
- android或 java内存泄漏需要注意的地方
- 部署LyncServer2013之二 扩展架构
- canvas绘图基础
- 百度地图查询两地里程
- Result Maps collection already contains value for com.acmed.ecg.common.dao.WorkloadMapper.ReportResu
- yii CActiveForm CHtml组件使用总结
- 向mysql数据库中写入中文,报错问题解决