这个语法应该很多人知道,看来还是我基础不好,所以才一时没看懂
同样是在跟内核代码码时发现
#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) 就是检验指针是否合法