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

来源:互联网 发布:期货 可用资金算法 编辑:程序博客网 时间:2024/06/05 22:49

 

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

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

#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) 就是检验指针是否合法

阅读全文
0 0