最近的工作遇到了一个很基础的c++数据越界的问题,程序运行一直报“内存不足”。开始一直以为是程序运行时产生了内存碎片导致,无法分配一大块内存区。后来终于发现是一个非常基础的数据越界问题。
问题演示:
int h,w,count,imgsize;
h=20000;
w=20000;
count=7
imgsize=h*w*count/8;
byte* img=new byte[imgsize];//操作系统提示:内存不足
分析:
int占32位是,最大整数是2^31-1=2147483647;而刚计算的w*h*count/8=20000*20000*7/8=350000000;小于于int的最大整数。但是打断点发现imgsize的值是一个随机负数。我感到很懵,于是病急乱投医,改成了下面这样的。
double imgsize=h*w*count/8;
问题还是没有解决,于是我怀疑计算机的计算能力坏掉了哈哈,把这个式子拆分开来计算,结果竟然对了。
double imgsize=w;
imgsize*=h;
imgsize*=count;
imgsize/=8;
后来我分析:因为20000*20000*7=2800000000,已经大于int的最大整数,所以变成了一个负随机数,再进行除以8的运算,最终的结果就是负随机数
double imgsize=20000*20000*7/8
果然,计算机的计算方式跟人脑是不一样的。