SA0130: Implizite erweiternde Konvertierungen
Funktion | Ermittelt Codestellen, an denen bei arithmetischen Operationen implizit Konvertierungen von kleineren in größere Datentypen durchgeführt werden. |
Begründung | Der Compiler erlaubt jegliche Zuweisungen von unterschiedlichen Typen, wenn der Wertebereich des Quelltyps vollständig im Wertebereich des Zieltyps enthalten ist. Allerdings baut der Compiler eine Konvertierung so spät wie möglich in den Code ein. Bei einer Zuweisung der folgenden Art:
führt der Compiler die implizite Konvertierung erst nach der Multiplikation durch:
Ein Überlauf wird daher abgeschnitten. Wenn Sie das verhindern wollen, können Sie die Konvertierung bereits für die Elemente durchführen lassen:
Es kann daher sinnvoll sein, sich Stellen melden zu lassen, an denen der Compiler implizite Konvertierungen einbaut, um zu prüfen, ob diese genau so gewollt sind. Außerdem können explizite Konvertierungen zu besserer Portierbarkeit auf andere Systeme dienen, wenn diese restriktivere Typprüfungen haben. |
Ausnahme | BOOL ↔ BIT |
Wichtigkeit | Niedrig |
Beispiele:
PROGRAM MAIN
VAR
nDINT : DINT;
nLINT : LINT;
nUSINT : USINT;
nUINT : UINT;
nUDINT : UDINT;
nULINT : ULINT;
nLWORD : LWORD;
fLREAL : LREAL;
nBYTE : BYTE;
END_VARnDINT := UINT_TO_DINT(nUINT) * UINT_TO_DINT(nUINT); // no error
nDINT := nUINT * nUINT; // => SA0130
nLINT := nDINT * nDINT; // => SA0130
nULINT := nUSINT * nUSINT; // => SA0130
nLWORD := nUDINT * nUDINT; // => SA0130
fLREAL := nBYTE * nBYTE; // => SA0130