细数linux内核里那些偏门的C语言语法(四)(unsigned long)-MAX_ERRNO

 

这个语法应该很多人知道,看来还是我基础不好,所以才一时没看懂

同样是在跟内核代码码时发现

#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)

 

其中

#define MAX_ERRNO 4096

 

(unsigned long)减去MAX_ERRNO ? 这是什么鬼?

 

其实不是,真正的意思是 - MAX_ERRNO 然后强制转换为(unsigned long)类型

就是相当于(unsigned long)(-4095)

 

强转时,负数为正数的补码,补码为反码加1

以char 型为例子  1 的补码为 二进制11111110b

加1为 11111111b

  十六进制为0xFF

那么-1转换为(unsigned long)类型为0xFFFFFFFF

以此类推

-4095 转换为(unsigned long)类型为0xFFFFF001

 

 

#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) 表示值大于等于0xFFFFF001 的指针判断为错误指针

 

linux内核里把 -MAX_ERRNO 到 -1作为指针的错误码

 

IS_ERR_VALUE(x) 就是检验指针是否合法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值