linus2k

君子常当当的博客

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  41 随笔 :: 1 文章 :: 21 评论 :: 0 Trackbacks
看看下面的输出是多少
#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,没有隐式的类型提升的机会


posted on 2008-02-15 10:53 君子常当当 阅读(375) 评论(2)  编辑 收藏 引用 所属分类: C++编程

评论

# re: 一个可怕的陷阱 2008-02-15 20:31 踏雪赤兔
编译器会报warning的吧
就算没有,这样的习惯也不好,不要太依赖隐式转换,可以这样写
long long a = 1024ll * 1024 * 4;
就没有问题了  回复  更多评论
  

# re: 一个可怕的陷阱 2008-02-18 11:13 君子常当当
@踏雪赤兔
c++都快忘光了,呵。。。  回复  更多评论
  

只有注册用户登录后才能发表评论。