早在学习谭老的 《C语言程序设计》时就见过计算机中所谓的“溢出”两字,可那时对此没什么特别的感觉,只是知道了有这么回事:用char型只能存储0 ~ 256大小的字符,int只能存储 -2^15 ~ 2^15-1 大小的数,超出这个范围就会发生溢出,就出错了。再后来为了考研,学习了计算机专业课,对计算机底层的东西了解了一些,知道了当计算机存不下超过存储位数的数据,有数据表示不了点错误,在cpu计算和存储时都会发生溢出。可这些东西都停留在了解到阶段,算是理性认识吧。实际编程中尽量估计好数据范围,基本没碰到过溢出导致的隐性bug(主要是本科时基本没怎么写过程序)。
这次在实验室做项目总算是真正自己编写了上千行的代码,对编程有了小小的感性认识。这几天碰到了两个让人头疼的bug,程序在刚开始运行时没问题,可一到计算复杂时就出现莫名错误,反复查看了代码也没什么头绪,最后在单步跟踪时发现了问题,大致情况是这样的,当初设计程序时考虑到变量a的值会很大,于是a的类型设为long int,a = b * c; b和c都是int型,这里a虽然是long int 型,但b*c时,因为b c都是int型,所以b*c的也是int型,当结果非常大时,这个结果会发生溢出,导致a的值是错误的。
解决方法也很简单,只要把b或c改成long int型,这样计算b*c时,结果也是long int型,赋给a的值也就是正确的结果了。