Rileva le conversioni implicite da tipi di dati più piccoli a tipi di dati più grandi.
Giustificazione: Il compilatore consente qualsiasi assegnazione di tipi diversi quando
l'intervallo di valori del tipo sorgente è completamente contenuto nell'intervallo
di valori del tipo di destinazione. Tuttavia, il compilatore inserisce la conversione
nel codice il più tardi possibile. Per un'assegnazione di tipo lint := dint * dint, il compilatore esegue la conversione implicita solo dopo la moltiplicazione: lint := TO_LINT(dint * dint). Un overflow viene quindi troncato. Per evitarlo, si possono già convertire gli elementi:
lint := TO_LINT(dint) * TO_LINT(dint). Pertanto, può essere utile segnalare le posizioni in cui il compilatore implementa
conversioni implicite, per verificare se sono esattamente quelle previste. Inoltre,
le conversioni esplicite possono essere usate per migliorare la portabilità su altri
sistemi, quando questi ultimi hanno controlli di tipo più restrittivi.
Importanza: Basso
Esempio
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: Implicit widening conversion from type 'INT' to type 'LINT' --> SA0130: Implicit widening conversion from type 'USINT' to type 'ULINT' --> SA0130: Implicit widening conversion from type 'UDINT' to type 'LWORD' --> SA0130: Implicit widening conversion from type 'BYTE' to type 'LREAL' --> SA0130: Implicit widening conversion from type 'UINT' to type 'DINT'