stateflowに​記載した即値をオート​コードする際、符号な​しと認識させる方法は​ありますか

4 views (last 30 days)
stateflowに以下のような記載をしました。
  a ++;
 ※変数は、uint8 a;で宣言。
この時、オートコード結果は、以下のようになりました。
  a = (uint8)(a + (int16)1);
 1を符号ありにキャストしてから、符号なしにキャストとなってしまいました。
無駄なキャストを辞めて、以下のようなオートコードを求めています。
a ++; のまま
 もしくは、
a = a + (uint8)1;
即値は全て符号なしと判断され、上記のキャストとなったことは理解できます。
そこで、Stateflow上で即値を"符号なし"と判断させる方法はありませんか。
 ※C言語の 1u というような記載方法
また、キャストモードは、”明示的”にしています。
"ノミナル"に設定すれば期待した結果となることは確認しましたが、
できれば"明示的"で即値の符号あり/なしをコントロールしたいと考えています。

Accepted Answer

ryosuke nakatsuka
ryosuke nakatsuka on 21 Oct 2020
ご回答ありがとうございます。
そちらは既に試しました。
 a = a + uint8(1);
しかし、キャストに変化はありませんでした。
また、以下も試しました。
  a = a + 1.; // .を追加
すると、以下の出力になりました。
  a = uint8(a + (int16(uint8(1)));
以上、宜しくお願い致します。
  3 Comments
Toshinobu Shintai
Toshinobu Shintai on 27 Oct 2020
返事が遅くなりまして、申し訳ありません。
以前、バグとお伝えしましたが、間違いでした。申し訳ありません。この挙動は、キャスティングモードを明示的にした際の正しい挙動となります。以下に説明を記載します。
The usual binary conversion(s) say that a signed int, will be cast to an unsigned int when the other operand of a binary operation is unsigned.
|
v
repro_Y.Out2 = (uint8_T)((uint32_T)(int32_T)repro_U.In3 + 1U);
^ ^
| |
The usual unary conversion(s) require any integer smaller than 'int' will be cast to 'int'
|
Finally, the result of the addition is converted to the type being assigned to so that it fits properly.
このような無駄なキャストを避けるには、その他のキャスティングモードを選択する必要があります。

Sign in to comment.

More Answers (1)

Toshinobu Shintai
Toshinobu Shintai on 21 Oct 2020
MATLAB言語では、以下のように記述するとデータ型を明示できます。
uint8(1)
上記のuint8の部分は、int32やdoubleなど、標準のデータ型名を用いることができます。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!