10

以前の質問に関連して、MISRA C 2004 のいくつかのルールがわかりません。

ISO C99 ドラフト 2007の6.5 セクション §4 :

一部の演算子 (単項演算子 ~ と、2 項演算子 <<、>>、&、^、および | をまとめてビット演算子と呼ぶ) は、整数型のオペランドを持つ必要があります。これらの演算子は、整数の内部表現に依存する値を生成し、符号付き型の実装定義および未定義の側面を持ちます。

わかりました。ビットごとの演算子で符号付き整数を使用すると、未定義の動作が発生する可能性があります (意味がありません)。

良い解決策は、整数の昇格をバイパスするために、より広い符号なし整数型への明示的な変換を使用し、ビットごとの演算子で符号付きの値を使用しないことです (以前の質問の関連する回答を参照してください)。

しかし、MISRA C 2004 では、ビット単位の演算子で小さな符号なし整数を使用できます (ルール 10.5 など)。整数昇格がビットごとの演算子で符号付きの値を使用することにつながるのはなぜですか? わからないこともあると思います。

4

1 に答える 1

1

ルールは互いに矛盾しないため、型を拡張する必要はありません。短整数二項演算の結果をすぐにその型にキャストできます。

最初のオペランドが int でない限り、短整数はシフトのために int に昇格されません。

これは彼らの例からです:

uint8_t port = 0x5aU;
uint8_t result_8;
uint16_t result_16;

result_8 = (~port) >> 4;  /* not compliant */
result_8 = ((uint8_t)(~port)) >> 4; /* compliant */
result_16 = ((uint16_t)(~(uint16_t)port)) >> 4; /* compliant */
于 2014-10-07T15:15:14.873 に答える