宏定义秒数

一年秒数定义,忽略闰年

#define SECONDS (365*24*60*60)UL

宏定义数字默认是unsigned int类型,UL是指无符号长整型,365*24*60*60=‭288313344‬,这个数转换成16进制是0x‭112F5000‬,如果是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字节的部分。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值