2013-04-18 14 views
7

Nel file di origine che sto usando nel mio progetto, v'è un confronto tra ssize_t e size_t variabili:Fusioni ssize_t o size_t

ssize_t sst; 
size_t st; 

if(sst == st){...} 

vorrei per sbarazzarsi di avvertimento:

warning: comparison between signed and unsigned integer expressions 

Ma non sono sicuro, quale variabile devo trasmettere all'altro?

if((size_t)sst == st){...} 

o

if(sst == (ssize_t)st){...} 

Che cosa è più sicuro, migliore, più pulito? Grazie

+0

Che lingua stai usando? –

+0

Tag aggiunto, C++. – rluks

+0

Provare a anteporre '(signed int)' prima del numero intero senza segno. Ora dovrebbe essere sia un intero con segno che non generare più l'errore. –

risposta

16

Non c'è una risposta giusta a questa domanda. Esistono diverse risposte possibili, a seconda di ciò che si sa a priori sui valori che possono assumere tali variabili.

  • Se si sa che sst è non negativo, allora si può tranquillamente lanciare sst a size_t, in quanto questo non cambierà il valore (per inciso, questo è quello che succede se non avete getto a tutti).

  • Se sst potrebbe essere negativo, ma si sa che st sarà mai più grande di SSIZE_MAX, allora si può tranquillamente lanciare st-ssize_t, in quanto questo non cambierà il valore.

  • Se sst potrebbe essere negativo, e st potrebbe essere maggiore di SSIZE_MAX, allora non gettate è corretta; uno dei due potrebbe cambiare il valore, determinando un confronto scorretto. Invece, si dovrebbe fare il seguente if (sst >= 0 && (size_t)sst == st).

Se non siete assolutamente certi che una delle prime due situazioni si applica, scegliere la terza opzione in quanto è corretto in tutti i casi.

+1

+1 per l'espressione più semplice - non c'è motivo di avere il '(st <= SSIZE_MAX)' ho incluso nella mia risposta. –

3

O funzionerà bene finché entrambi i valori rientrano nell'intervallo rappresentabile positivo di ssize_t.

Se uno dei due valori non si, si potrebbe finire nei guai - controllare i casi prima del test per l'uguaglianza:

if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st)) 
{ 
    ... 
} 

(Sono sicuro che la gente C++ si consiglia di evitare il C- stile cast interamente - non ho dubbi che qualcuno commenterà o risponderà e ti farà sapere il modo giusto per farlo in C++)

+1

Dopo aver eliminato 'sst <0', puoi semplicemente convertire in' size_t' e confrontare. –

+0

@StephenCanon, sì. + 1ed la tua risposta per questo già. –

+1

'static_cast (st)' è un cast di C++ leggermente più sicuro. – Yakk