@Quiche-Lorraine sagte in Round-Trip-Cast als Prüfung für verlustfreien Cast?:
Mein Cast ist hauptsächlich für Integer gedacht und die KI hat diese auch für Gleitkommazahlen erweitert.
Okay, Integer kriegen wir hin, ganz ohne Philosophie über Bedeutung von Gleichheit .Da ist alles ganz klar definiert, und es gibt nur eine Handvoll Fälle (Signed/Unsigned; mehr/weniger Bits). Da kann man ganz klar prüfen, ob es theoretische Grenzen gibt, und ob man über diesen liegt. Aber wichtig: Man muss aufpassen, dass man bei den Vergleichen keine falschen Integerkonvertierungen macht! Denn wenn man schon auf dem Integertypen mit dem höchsten Rang, aber unterschiedlichem Vorzeichen ist, passieren sonst ungewollte Wertumwandlungen.
Dann haben wir:
Gleiche Signage; Zieltyp größer/gleich: Automatisch sicher (Theoretisch könnte der Zieltyp noch anders gewichtet um die 0 herum liegen, aber wir nehmen mal an, dass wir nicht auf einem außerirdischen Computer laufen )
Gleiche Signage, Zieltyp ist kleiner: Wert muss innerhalb der Grenzen von numeric_limits::min/max des Zieltyps liegen. Der Vergleich wird durchgeführt mit dem größeren Quelltyp und man hat keine Probleme mit Konvertierung.
Signed nach Unsigned, Zieltyp größer/gleich: Wert muss >= 0 sein (dem min des Zieltyps). Das ist auch gleichbedeutend damit, dass er zwischen den Grenzen der numeric_limits des Ziels liegt, aber wenn wir unnötigerweise auf max prüfen, machen wir ggf. Konvertierungsfehler beim Vergleich. Daher lassen wir das lieber sein.
Signed nach Unsigned, Zieltyp kleiner: Wert muss innerhalb der Grenzen von numeric_limits::min/max des Zieltyps liegen. Der Vergleich wird durchgeführt mit dem größeren Quelltyp und man hat keine Probleme mit Konvertierung.
Unsigned nach Signed, Zieltyp ist größer: Automatisch sicher, außer auf außerirdischen Maschinen
Unsigned nach Signed, Zieltyp ist kleiner/gleich: Wert muss unterhalb max des Zieltyps liegen; siehe oben zu Konvertierungsfehlern der min-Vergleiche, die wir vermeiden, indem wir diese unnötige Bedingung gar nicht prüfen. Der Vergleich passiert im größer/gleichen Quelltyp (oder einer noch größeren Promotion), der in jedem Fall das max des Zieltyps korrekt aufnehmen kann.
Die Größe würde ich dabei tatsächlich mit sizeof vergleichen. Dann braucht man nicht nachdenken, ob die Vergleiche zwischen den Limits der größten Integertypen funktionieren wie man denkt.
Die aufgezählten Branches sind statische Eigenschaften der Typen und können mit Templates spezialisiert werden. Aber meine Kaffeepause ist vorbei, das programmiere ich jetzt nicht aus. Sollte relativ einfach runter zu schreiben sein.