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

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

采纳的回答

ryosuke nakatsuka
ryosuke nakatsuka 2020-10-21
ご回答ありがとうございます。
そちらは既に試しました。
 a = a + uint8(1);
しかし、キャストに変化はありませんでした。
また、以下も試しました。
  a = a + 1.; // .を追加
すると、以下の出力になりました。
  a = uint8(a + (int16(uint8(1)));
以上、宜しくお願い致します。
  3 个评论
ryosuke nakatsuka
ryosuke nakatsuka 2020-10-27
※回答に書いてしまったので、コメントに移動します。
ご回答ありがとうございます。
こちらの環境では、先に書いた通りキャストモードを"明示的"にしています。
頂いたモデルも、キャストモードを"明示的"に変更すると、
以下のようなコードとなりました。
 a = (uint8)((uint32)(int32)a+1u);
単純な変数間の代入は明示的なキャストを求めています。
即値の謎符号付きキャストを抑制したいです。
以上、宜しくお願い致します。
Toshinobu Shintai
Toshinobu Shintai 2020-10-27
编辑:Toshinobu Shintai 2020-10-31
返事が遅くなりまして、申し訳ありません。
以前、バグとお伝えしましたが、間違いでした。申し訳ありません。この挙動は、キャスティングモードを明示的にした際の正しい挙動となります。以下に説明を記載します。
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.
このような無駄なキャストを避けるには、その他のキャスティングモードを選択する必要があります。

请先登录,再进行评论。

更多回答(1 个)

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

类别

Help CenterFile Exchange 中查找有关 複雑なロジック 的更多信息

产品


版本

R2015a

Community Treasure Hunt

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

Start Hunting!