Ermittelt implizit durchgeführte Konvertierungen von kleineren auf größere Datentypen.
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:
lint := dint * dint
führt der Compiler die implizite Konvertierung erst nach der Multiplikation durch:
lint := TO_LINT(dint * dint)
.
Ein Überlauf wird daher abgeschnitten. Wenn Sie das verhindern wollen, können Sie
die Konvertierung bereits für die Elemente durchführen lassen:
lint := TO_LINT(dint) * TO_LINT(dint)
.
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.
Wichtigkeit: Niedrig
Beispiel
PROGRAM PLC_PRG VAR byTemp : BYTE; usiTemp : USINT; uiTemp: UINT; iTemp : INT; udiTemp: UDINT; diTemp : DINT; uliTemp : ULINT; liTemp : LINT; lwTemp : LWORD; lrTemp : LREAL; END_VAR liTemp := iTemp; // SA0130 uliTemp := usiTemp; // SA0130 lwTemp := udiTemp; // SA0130 lrTemp := byTemp; // SA0130 diTemp := uiTemp; // SA0130 byTemp.5 := FALSE; // OK (BIT_BOOL conversion) --> SA0130: Implizite erweiternde Konvertierung vom Typ 'INT' zu Typ 'LINT' --> SA0130: Implizite erweiternde Konvertierung vom Typ 'USINT' zu Typ 'ULINT' --> SA0130: Implizite erweiternde Konvertierung vom Typ 'UDINT' zu Typ 'LWORD' --> SA0130: Implizite erweiternde Konvertierung vom Typ 'BYTE' zu Typ 'LREAL' --> SA0130: Implizite erweiternde Konvertierung vom Typ 'UINT' zu Typ 'DINT'