Skip to main content

SA0130:隐式扩展转换

检测算术运算期间隐式执行从较小数据类型到较大数据类型的转换的代码位置

理由:当源类型的值范围完全包含在目标类型的值范围内时,编译器允许不同类型的任何赋值。但是,编译器将尽可能晚地构建对代码的转换。对于类型的赋值 lint := dint * dint,编译器仅在乘法之后执行隐式转换:

lint := TO_LINT(dint * dint);

因此溢出被截断。如果你想防止这种情况,那么你已经可以转换元素:

lint := TO_LINT(dint) * TO_LINT(dint);

因此,报告编译器实现隐式转换的位置可能很有用,以便检查这些转换是否完全符合预期。此外,当其他系统具有更严格的类型检查时,显式转换可用于提高其他系统的可移植性。

重要性:低

55. 例子
PROGRAM PLC_PRG
VAR
    d : DINT;
    l : LINT;
    ui : UINT;
    uli : ULINT;
    usi : USINT;
    lw : LWORD;
    udi : UDINT;
    lr : LREAL;
    b : BYTE;
END_VAR
(*The following lines could result in unwanted truncating by implicit conversions 
and should be reported with SA0130*) 
l := d * d;
uli := usi * usi;
lw := udi * udi;
lr := b * b;
d := ui * ui;

输出在 留言 看法:

  • sa_icon_message.png SA0130:从类型“DINT”到类型“LINT”的隐式扩展转换

  • sa_icon_message.png SA0130:从类型“USINT”到类型“ULINT”的隐式扩展转换

  • sa_icon_message.png SA0130:从类型“UDINT”到类型“LWORD”的隐式扩展转换

  • sa_icon_message.png SA0130:从类型“USINT”到类型“LREAL”的隐式扩展转换

  • sa_icon_message.png SA0130:从类型“UINT”到类型“DINT”的隐式扩展转换