Ich versuche, eine C ++ - Template-Funktion zu schreiben, die eine Laufzeitausnahmebedingung für Integer-Überläufe in Umwandlungen zwischen verschiedenen ganzzahligen Typen mit unterschiedlichen Breiten und möglichen Unsigned / Unsigned Mismatch auslöst. Für diese Zwecke geht es nicht um das Umwandeln von Gleitkommatypen in Ganzzahltypen oder andere Objekt-Objekt-Konvertierungen. Ich würde dies gerne tun, ohne viel Spezialcode schreiben zu müssen. Das habe ich derzeit:
%Vor%Ist das korrekt und effizient?
EDIT: Aus verschiedenen Gründen ist stl nicht verfügbar, also kann ich nicht std :: numeric_limits verwenden, und alles von Boost ist direkt out.
Sie können die minimalen und maximalen sicheren Werte (und eine ganze Menge anderer Informationen) für jeden fundamentalen Typ mit der std::numeric_limits
Vorlage, z. %Code%. Sie müssen std::numeric_limits<T>::max()
einfügen.
Referenz: Ссылка
Ist Boost eine Option? Wenn ja, versuchen Sie boost :: numeric_cast & lt; & gt; . Es scheint die gewünschten Eigenschaften zu bieten.
Ich denke, dass diese jetzt funktionieren, unabhängig davon, ob Sie Zweierkomplement verwenden oder nicht. Bitte testen Sie ausführlich, bevor Sie es verwenden. Sie geben die folgenden Ergebnisse. Jede Zeile gibt einen Assertionsfehler (ändern Sie sie einfach in Ausnahmen)
%Vor%Implementierung. Zuerst einige Dienstprogramme, um nach ganzzahligen Rängen zu suchen (Typen mit höheren Rängen können Werte von Typen mit niedrigerem Rang enthalten, wenn das gleiche Vorzeichen gegeben wird. Und einige Promotion-Tools, um einen gemeinsamen, sicheren Typ herausfinden zu können ergibt einen signierten Typ, wenn ein vorzeichenloser Typ beteiligt ist, wenn der signierte Typ nicht alle Werte des unsignierten Typs speichern kann.)
%Vor%Die Umwandlungsvorlagen nutzen diese, um für jeden Fall herauszufinden, was getan oder nicht getan werden muss.
%Vor%Wie wäre es mit:
%Vor%Dann überprüfst du nur, ob das Casting funktioniert hat. Stellen Sie sicher, dass Sie zurückbekommen, womit Sie begonnen haben, und dass das Zeichen nicht umgedreht wurde.
BEARBEITEN: Da der Kommentar unten durcheinander geraten ist, hier ist es, formatiert:
%Vor%Die Besetzung von int nach char funktioniert gut. Der Cast von Char auf unsigned Char löst eine Ausnahme aus (wie es sollte). Ich sehe hier kein Problem.
Habe ich richtig angenommen, dass in dem Fall, dass R signiert ist, Sie versuchen, rMax mit allen 1en außer dem letzten Bit zu füllen? Wenn das der Fall ist, sollten Sie 0x80 (1000 0000) anstelle von 0x10 (0001 0000) haben.
Es sieht auch nicht so aus, als ob Ihre Funktion negative Zahlen für die Quelle unterstützt.
Bearbeiten:
Hier ist eine leicht bearbeitete Version, die ich für die Konvertierung von Ints in Zeichen getestet habe:
%Vor%Bearbeiten: Fehler behoben.
betrachten Sie Safe Numerics unter Ссылка
Diese Bibliothek bietet Drop-In-Ersetzungen für alle C-primitiven Integer-Typen. C-Vorgänge, die zu fehlerhaften Ergebnissen führen - einschließlich des Gießens - werden beim Erkennen abgefangen.
Tags und Links c++ templates casting integer-overflow