問題はレートと割合の両方が静かに「INT」と入力し、整数プロモーションによって促進されるということです。したがって、乗算は符号付きの型で実行されます。
uint16_t basic_units = (uint8_t)(rate * percentage);
EDIT:
MISRA互換コードは
uint16_t basic_units = (uint16_t)rate * (uint16_t)percentage;
ようにコードを書き換えるか、MISRAが示唆するように実行するかのいずれかであり、すぐに「下地タイプ」への発現の結果を型キャスト:明確化が続く。
ISO 9899:1999 6.3.1.1 2
INTが元の型のすべての値を表すことができる場合、値はintに変換されます。 それ以外の場合は、符号なしのintに変換されます。これらは、整数 プロモーションと呼ばれます。 MISRA-Cから
参考テキスト:
MISRA-C:2004 6.10.3危険型変換:
/-/
- 算術における符合の変更オペレーション:インテグラルプロモーションは、多くの場合、タイプ(符号付き)の結果を返す2つの符号なしオペランドがになることがあります。例えば、のが32ビットであるが、の場合が16ビットの場合、符号なしの16ビットの結果である場合、2つの16ビットの符号なしオペランドを加算すると符号付きの32ビットの結果が得られます。私は後者のみが基本となる型に即時キャストを強制するところ考え直しで、私は、10.5とMISRA 10.1を混同している可能性があり、実際に上記の私の第二ラインはMISRAを満たすかどうかどうかわからないんだけど、
特定のビット演算子の場合。
私はLDRA静的コード分析で両方の行をテストしましたが、不平を言っていませんでしたが、LDRAはMISRA-Cでも非常にうまく機能しません。
とにかく、元の質問に問題が速度及び百分率の両方暗黙INTはuint8_tのすべての値を表すことができるので、署名されINTを入力する整数キャンペーンによって変換されることです。だからそれはなる
uint16_t basic units = (int)rate * (int)percentage.
これを防ぐには、明示的に型変換する必要があります。それ以上の考えを与えた後、私は上記の私の2つの1行目に行きます。
2行目の 'uint16_t'に変換するのですか? – pmg
2つの符号なし型 'uint8_t'の宣伝は、より大きな符号なし型' unsigned int'またはより単純に 'uint16_t'ではなく、符号付き型' int'をもたらすのはなぜですか? – Ioan
@pmg私は実際にMISRAルール10.1と10.5を混ぜ合わせたと思う。それが〜または<<演算子であれば、私はMISRAが「基礎となるタイプ」に型キャストすることを余儀なくされたでしょう。私は事を明確にするために投稿を編集しました。 – Lundin