2013-04-18 8 views
7

In Quelldateien, die ich in meinem Projekt verwende, gibt es einen Vergleich zwischen ssize_t und size_t Variablen:Guss ssize_t oder size_t

ssize_t sst; 
size_t st; 

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

Ich mag würde die Warnung loszuwerden:

warning: comparison between signed and unsigned integer expressions 

Aber ich bin mir nicht sicher, welche Variable sollte ich in die andere werfen?

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

oder

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

Was ist sicherer, besser, sauberer? Danke

+0

Welche Sprache verwenden Sie? –

+0

Hinzugefügtes Tag, C++. – rluks

+0

Versuchen Sie, '(vorzeichenbehaftet int)' vor die Ganzzahl ohne Vorzeichen zu setzen. Es sollte jetzt beides sein, eine vorzeichenbehaftete ganze Zahl und würde den Fehler nicht mehr werfen. –

Antwort

16

Es gibt keine richtige Antwort auf diese Frage. Es gibt mehrere mögliche Antworten, je nachdem, was Sie wissen a priori über die Werte, die diese Variablen annehmen können.

  • Wenn Sie wissen, dass sst nicht-negativ ist, dann können Sie werfen sicher sst zu size_t, da dies den Wert nicht ändern (nebenbei bemerkt, das ist, was passiert, wenn Sie keine Gussüberhaupt haben).

  • Wenn sst könnte negativ sein, aber Sie wissen, dass st nie als SSIZE_MAX größer sein, dann können Sie sicher st-ssize_t werfen, da dies den Wert nicht ändern.

  • Wenn sst möglicherweise negativ ist und st möglicherweise größer als SSIZE_MAX ist, dann ist keine der beiden Darstellungen korrekt; Entweder könnte man den Wert ändern, was zu einem falschen Vergleich führt. Stattdessen würden Sie folgendes tun: if (sst >= 0 && (size_t)sst == st).

Wenn Sie nicht absolut sicher, dass eine der ersten beiden Situationen gilt, wählen Sie die dritte Option, wie es richtig ist in allen Fällen.

+1

+1 für den einfacheren Ausdruck - es gibt keinen Grund, das '(st <= SSIZE_MAX)' in meine Antwort aufzunehmen. –

3

Entweder funktioniert gut, solange beide Werte in den positiv darstellbaren Bereich von ssize_t passen.

Wenn entweder Wert nicht der Fall ist, könnten Sie am Ende in Schwierigkeiten - die Fälle überprüfen, bevor für die Gleichstellung Prüfung:

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

(Ich bin sicher, dass die C++ Menschen empfehlen, die C- vermeiden Stil komplett gegossen - ich habe keinen Zweifel, jemand wird kommentieren oder beantworten und lassen Sie den richtigen Weg, um das in C++ zu tun.)

+1

Sobald Sie 'sst <0' ausschließen, können Sie einfach in 'size_t' konvertieren und vergleichen. –

+0

@StephenCanon, yup. + 1ed Ihre Antwort dafür schon. –

+1

'static_cast (st)' ist ein etwas sicherer C++ Cast. – Yakk