細數linux核心裡那些偏門的C語言語法(四)(unsigned long)-MAX_ERRNO
阿新 • • 發佈:2019-02-18
這個語法應該很多人知道,看來還是我基礎不好,所以才一時沒看懂
同樣是在跟核心程式碼碼時發現
#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) 就是檢驗指標是否合法