gccを使用して、STM32F105用のアプリケーションをcで作成しています。
(単純なプロジェクトで)過去には、私はいつものように、変数定義されているchar
、int
、unsigned int
、などを。
私は、次のような、stdint.hで定義された型を使用するのが一般的であることがわかりint8_t
、uint8_t
、uint32_t
それは私が使用していることを複数のAPIのでは、ともSTからARM CMSISライブラリにtrueこの、など。
なぜそうするべきかを理解していると思います。コンパイラがメモリ空間をより最適化できるようにします。他にも理由があると思います。
ただし、cの整数プロモーションルールのため、2つの値を追加したり、ビットごとの演算を実行したりするたびに、変換警告に対して実行し続けますconversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
。この問題については、こことここで説明します。
int
またはとして宣言された変数を使用する場合は発生しませんunsigned int
。
これを考えて、いくつかの例を挙げます。
uint16_t value16;
uint8_t value8;
これを変更する必要があります。
value16 <<= 8;
value8 += 2;
これに:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
いですが、必要に応じてできます。私の質問は次のとおりです。
変換する場合があり、符号なしに署名したとするバック符号なしの結果が不正確になりますか?
stdint.h整数型を使用する/使用しない他の大きな理由はありますか?
私が受け取った答えに基づいて、cが変換uint
しint
、戻っても、stdint.hタイプが一般的に好まれているようです。これはより大きな質問につながります:
- 型キャスト(例
value16 = (uint16_t)(value16 << 8);
)を使用して、コンパイラの警告を防ぐことができます。問題を隠しているだけですか?それについてもっと良い方法はありますか?
value8 += 2u;
とvalue8 = value8 + 2u;
、私は同じ警告を取得します。
8u
および2u
。