栽到一个简单的坑里了,怪自己基础不牢,网上查了下,中文的结果貌似没有写这个的,所以发出来。
下面的代码,变量 i 的值是多少呢:
#define P (64*1024)
long long i = P * P;
答案是 i 溢出了,暂时我看到结果 i = 0(当然这很有可能结果属于未定义)。
解决的关键是,对于运算可能出现超出int范围的常数,一律声明为long,比如
#define P (64*1024l)
其中的关键是常数在C语言的运算中是什么类型的,长度多少。
首先一个前提,常数本身可以存储为int不溢出,否则声明常数的时候就必须带"l"或者"ll"后缀,也就不存在上面的乘法溢出的错误;
然后如果跟常数运算的是变量,那么运算结果的类型与该变量相同。一般对于变量的长度,声明时候会加以注意,不至于栽到溢出的坑里;
最后就是上面这种情况了,常数与常数运算,结果的类型与接收结果的变量无关,只与声明常数时的后缀有关。因此在做常数的宏声明时,务必考虑可能出现的溢出情况,保险的话,尽量声明为long,因为真正使用宏的时候,是很难注意常数运算会不会溢出的!
最后的最后,编译器的警告需要认真对待!!