一年秒数定义,忽略闰年
#define SECONDS (365*24*60*60)UL
宏定义数字默认是unsigned int类型,UL是指无符号长整型,365*24*60*60=288313344,这个数转换成16进制是0x112F5000,如果是32位机器用unsigned int标识完全够用;但是如果是16位机unsigned int类型范围是0~2^16明显不够用,所以稳妥起见定义成unsigned long类型,防止移植时出错。
负数最高位时符号位,为1,比如-1的原码是1000 0001,反码是在计算机中整数都是用补码表示的,正数的原码、反码、补码都一样,负数是反码加1。
在glibc的memcpy原码里有这样一行代码:
len -= (-dstp) % OPSIZ;
dstp 是unsigned long int 类型的目标拷贝地址,len是要拷贝的数据长度,OPSIZ = 8这行代码的目的是计算目标地址到最大取址的字节数。我们知道不同位数的cpu一次最大取址的长度是不一样的,比如32位机器最大取址长度是2^32。比如 当前是32位机,这行代码的精妙之处在于-dstp直接计算出从dstp到2^32的bit数,然后除以8取余就是小于8字节的部分。