检测从较小数据类型到较大数据类型的隐式转换
理由当源类型的值范围完全包含在目标类型的值范围内时,编译器允许任何不同类型的赋值。不过,编译器会尽可能晚地在代码中进行转换。对于lint := dint * dint
类型的赋值,编译器只在乘法之后执行隐式转换:lint := TO_LINT(dint * dint)
。因此,溢出将被截断。为避免出现这种情况,您已经可以转换元素:lint := TO_LINT(dint) * TO_LINT(dint)
。因此,报告编译器实现隐式转换的位置可能会有所帮助,以便检查这些转换是否正是编译器的意图。此外,当其他系统有更严格的类型检查时,显式转换还可用于改善与这些系统的可移植性。
重要性:低
示例
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'