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:

nLINT := nDINT * nDINT;

führt der Compiler die implizite Konvertierung erst nach der Multiplikation durch:

nLINT := TO_LINT(nDINT * nDINT);

Ein Überlauf wird daher abgeschnitten. Wenn Sie das verhindern wollen, können Sie die Konvertierung bereits für die Elemente durchführen lassen:

nLINT := TO_LINT(nDINT) * TO_LINT(nDINT);

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_VAR
nDINT  := 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