1. 程式人生 > >細數linux核心裡那些偏門的C語言語法(四)(unsigned long)-MAX_ERRNO

細數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) 就是檢驗指標是否合法