2012-09-05 6 views

risposta

3

La miglior ragione per cui posso pensare è di evitare di introdurre una versione senza firma di off_t come un tipo in più; POSIX ha già una ridicola abbondanza di tipi interi con usi simili.

A parte questo, essere in grado di memorizzare -1 in st_size quando la dimensione non è un concetto che ha senso è probabilmente utile; Non sono sicuro che eventuali implementazioni lo facciano e non riesco a trovare dove POSIX pone requisiti per i contenuti di st_size eccetto per i normali file e collegamenti simbolici ...

+0

Dove POSIX mette un requisito per 'st_size' per i file normali? – user1290696

+0

POSIX richiede 'st_size' per riflettere la dimensione effettiva del file per i file normali e richiede che rifletta la lunghezza del collegamento simbolico per i collegamenti simbolici. Il requisito per i collegamenti simbolici è documentato con 'stat'; il requisito per i file regolari sembra essere omesso lì, ma la documentazione per 'sys/stat.h' dice che per i file regolari,' st_size' è la dimensione del file in byte. –

2

off_t definisce gli offset in un file, che potrebbe essere uguale alla dimensione del file, ma può anche essere negativo, ad esempio se si cerca all'indietro.

Da questa relazione tra offset e dimensione, la dimensione di un file ha lo stesso tipo di un offset di file. Comunque, una dimensione del file non deve essere negativa.

0

off_t viene utilizzato per gestire gli offset di file in molte funzioni. Alcune funzioni utilizzano il valore speciale -1 (ad esempio lseek per segnalare che si è verificato un errore). Molti altri tipi di dati sono firmati in UNIX per contenere valori -1 (ad esempio time_t).

+2

Si noti che l'argomento 'lseek' è una posizione * relativa * del file (offset), che è il motivo principale per cui' off_t' deve essere firmato. E il fatto che tu possa cercare solo posizioni di file assoluti positivi impone una restrizione che i file non possono essere più grandi del valore massimo del tipo (firmato) 'off_t', quindi non c'è alcun uso nell'avere un' filesize_t' che non è firmato per contenere più grande valori. –

1

Penso che alcune funzioni di fseek in POSIX debbano accettare negativo come offset.

2

Nelle regole di promozione di C, le espressioni che combinano diverse dimensioni di tipi firmati si comportano allo stesso modo aritmetico-corretto indipendentemente dalle dimensioni coinvolte, a condizione che nessuno dei calcoli intermedi comporti. L'aggiunta di tipi senza segno, tuttavia, renderà il comportamento del codice molto più dipendente dalle dimensioni dei numeri interi.

Dato:

int test_size(off_t x, long y, long long z) 
{ 
    return x-y > z; 
} 

Se off_t erano senza segno quindi a seconda della sua dimensione potrebbe causare y arrivare promosso unsigned long, con calcolo eseguito su quel tipo, che quindi ottenere promosso signed long long e confrontati con z utilizzando un confronto firmato, o potrebbe causare z per ottenere la promozione in unsigned long long, nel qual caso il confronto complessivo sarebbe fatto in modo non firmato. Sarebbe anche possibile (anche se non necessariamente probabile) che off_t potrebbe essere abbastanza piccolo (e/o long abbastanza grande) che venga sottratto utilizzando l'aritmetica firmata.

Le quantità che potrebbero essere grandi abbastanza da richiedere qualcosa di almeno pari a int, anche se non saranno mai negative, dovrebbero generalmente essere rappresentate da tipi senza segno solo se vi è motivo di ritenere che non si adattano a un particolare firmato tipo, ma si inserirà certamente nella sua controparte non firmata. Tali situazioni non sono molto comuni, ma esistevano con size_t su sistemi a 16 bit (era architettonicamente impossibile per un singolo oggetto superare 64 KB, ma gli oggetti superiori a 32 KB erano comuni).Un tale scenario sembrerebbe meno avvincente in un'interfaccia di file system (se la firma a 32 bit non è sufficiente, a 32 bit senza segno probabilmente non sarà sufficiente neanche per molto tempo).

+0

Discorso interessante sulla matematica di tipo misto. L'uso di 'x-y * 1LL> z' in questo ipotetico può aiutare un po ', ma ha ancora fallimenti d'angolo. Hmmm. – chux