zlib中的adler32()函数用到宏NMAX , 该宏被定义为:
#define NMAX 5552
文件中给出的解释是
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
定义该宏的目的是保证宏DO1(buf,i)中的sum2 不发生累加溢出。
#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;}
具体分析如下:
1 sum2 是 32 bits 变量 应小于2^32。
2 sum2 的值是通过循环累加得到的。
sum2_new = sum2_old
+adler+buf[0]
+adler+buf[0]+buf[1]
~~~~~~~
+adler+buf[0]+buf[1]~~~+buf[NMAX]
<=sum2_old
+adler+0xff
+adler+0xff+0xff
~~~~~~~
+adler+0xff+0xff~~~+0xff
= sum2_old+NMAX*adler + 0xff*(1+2~~+NMAX)
3 adler<BASE, sunm2_old<BASE
4 sum2_new <= (NMAX+1)*(BASE-1)+ 0xff*(1+NMAX)*NMAX/2
因此
(NMAX+1)*(BASE-1)+ 0xff*(1+NMAX)*NMAX/2 <= 2^32-1
才可保证 sum2不溢出。