2010-11-22 14 views
1

Ist das sicher:Casting zwischen mit und ohne Vorzeichen

int main() 
{ 
    boost::int16_t t1 = 50000; // overflow here. 
    boost::uint16_t t2 = (boost::uint16_t)t1; 
    std::cout << t1 << " " << t2 << std::endl; 
} 

noch genauer zu sein: Ich bin Speicherung dieser Daten in einer Tabelle, die signierten Typen in seinem Schema verwendet, ist es sicher zu speichern und diese Daten auf diese Weise abrufen?

Danke!

+0

Bitte formatieren Sie Ihren Code mit der Taste '101010' oben im Bearbeitungsfenster. Und nein, C-Stil ist niemals sicher. Ich kann das sagen, ohne zu sehen, was diese Besetzung tut. – sbi

+1

@sbi, eine Signatur mit Vorzeichen ohne Vorzeichen (zum Beispiel) mit der gleichen Breite ist sicher und vollständig definiert, unabhängig davon, welche Syntax Sie verwenden. –

+1

Ich stimme zu, eine Neufassung Vorlagen mit primitiven Typen scheint mir ein lächerlicher Overkill. – teukkam

Antwort

4

Nein, ich glaube, das ist die Implementierung definiert. Aus dem C++ Standard-Entwurf, §4.7/3

Wenn der Zieltyp unterzeichnet wird, ist der Wert unverändert, wenn es in dem Zieltyp dargestellt werden kann (und bit- Feldbreite); Ansonsten ist der Wert implementierungsdefiniert.

Dies gilt für die erste Aussage. int16_t ist signiert, und es kann nicht 50000 darstellen. So hängt der Wert t1 von der Implementierung ab.

Sobald Sie t1 wissen, ist t2 von §4.7/2 garantiert den niedrigsten uint16_t kongruent Modul 2^16 bis t1 zu sein. Grundsätzlich t1 mod 2^16.

1

Ich würde sagen, es ist sicher, aber warum nicht mit einem uint16_t, ohne diesen irreführenden Cast zu durchlaufen?

Typen existieren auch für die Kommunikation, nicht nur für den Kompilierungsprozess.

0

Die Zuweisung einer Nummer, die nicht in einem signierten Typ dargestellt werden kann, ist implementierungsdefiniert. Die nächste Konvertierung hat jedoch ein standarddefiniertes Verhalten. Das Ergebnis der Funktion ist also eine definierte Implementierung, wenn das sicher ist oder nicht, ist eine subjektive Angelegenheit. Aber portabel über Plattformen oder Compiler ist es nicht.

Verwandte Themen