Da una prospettiva di ottimizzazione, l'utilizzo di numeri negativi consente ai kernel basati su Unix di verificare la presenza di un codice di errore utilizzando un solo confronto anziché due.
Le funzioni nel kernel restituiscono spesso i codici di errore al posto dei puntatori.Ciò significa che i codici di errore non possono sovrapporsi a indirizzi di puntatori validi, quindi dovrebbero essere fondamentalmente i valori senza segno più bassi (>= 0)
o quelli più alti (<= unsigned max)
.
Il controllo dei valori di puntatore per NULL
e per i codici di errore è un'operazione estremamente comune, quindi è consigliabile ottimizzarli.
Tipicamente fondo valori < 0x8000
sono NULL
ed i valori massimi sono codici di errore (ricordiamo che -1
è memorizzato come 0xff...ff
, il valore massimo possibile senza segno).
Questo significa che è possibile utilizzare un confronto per verificare la presenza di ciascuno:
NULL
se x <= 0x8000
(vero per 0 a 0x8000)
ERRNO
se x >= (unsigned long)(-MAX_ERRNO)
(vero per -1 a -MAX_ERRNO)
You can see this happening in Linux's err.h file.
Perché non ci piace niente di meno che il SUCCESSO! –
Non capisco perché la gente metta un tag "[C]" nel titolo di una domanda. Ogni domanda collega sempre quali sono i suoi tag (ad esempio la domanda è attualmente taggata [c], [errno], [valore di ritorno]. Perché non hai intitolato la domanda "[C] [errno] [valore di ritorno] Perché restituire un errore negativo? (es. return -EIO) "??? – Pete
Ho visto il titolo della domanda e immediatamente ho avuto un attacco, seguito da un profondo coma. Se non avessi un gruppo di risposta rapida di chirurghi cerebrali di livello mondiale su le mie premesse in ogni momento, chissà se mi sono ripreso in tempo per rispondere alla domanda? –