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' への暗黙的な拡張変換