Desde una perspectiva de optimización, el uso de números negativos permite que los kernels basados en Unix comprueben un código de error usando solo una comparación en lugar de dos.
Las funciones en el kernel devuelven frecuentemente códigos de error en lugar de punteros.Esto significa que los códigos de error no se pueden superponer con direcciones de puntero válidas, por lo que básicamente deben ser los valores sin signo más bajos (>= 0)
o los más altos (<= unsigned max)
.
La comprobación de los valores del puntero para NULL
y los códigos de error son operaciones extremadamente comunes, por lo que tiene sentido optimizarlas.
Típicamente la parte inferior valores < 0x8000
son NULL
y los valores superiores son códigos de error (recordemos que -1
se almacena como 0xff...ff
, el valor sin signo máximo posible).
Esto significa que se puede utilizar una comparación para comprobar si cada uno:
NULL
si x <= 0x8000
(válido para 0 a 0x8000)
ERRNO
si x >= (unsigned long)(-MAX_ERRNO)
(cierto para -1 a -MAX_ERRNO)
You can see this happening in Linux's err.h file.
Porque no nos gusta nada menos que ÉXITO! –
No entiendo por qué las personas ponen una etiqueta "[C]" en el título de una pregunta. Cada pregunta siempre vincula sus etiquetas (por ejemplo, la pregunta está actualmente etiquetada [c], [errno], [return-value]. ¿Por qué no tituló la pregunta "[C] [errno] [return-value]? devolver un error negativo? (por ejemplo, devolver -EIO) "??? – Pete
Miré el título de la pregunta y de inmediato tuve un ataque, seguido de coma profundo. Si no tuviera un equipo de respuesta rápida de cirujanos de cerebro de clase mundial en mis instalaciones en todo momento, ¿quién sabe si me hubiera recuperado a tiempo para responder la pregunta? –