С точки зрения оптимизации, использование отрицательных чисел позволяет ядрам на основе Unix проверять код ошибки, используя только одно сравнение вместо двух.
Функции в ядре часто возвращают коды ошибок вместо указателей. Это означает, что коды ошибок не могут перекрываться с действительными адресами указателя, поэтому в основном они должны иметь либо самые низкие значения без знака (>= 0)
, либо самые высокие значения (<= unsigned max)
.
Проверка значений указателей для NULL
и для кодов ошибок является очень распространенной операцией, поэтому имеет смысл оптимизировать их.
Обычно нижние значения < 0x8000
равны NULL
, а верхние значения - коды ошибок (помните, что -1
сохраняется как 0xff...ff
, максимально возможное значение без знака).
Это означает, что вы можете использовать одно сравнение для проверки:
NULL
, если x <= 0x8000
(верно для 0 до 0x8000)
ERRNO
, если x >= (unsigned long)(-MAX_ERRNO)
(истина от -1 до -MAX_ERRNO)
Вы можете увидеть это в файле err.h Linux.