何故警告が出るのか教えてください

上の式は警告が出ないのに、下の式は警告が出る理由が分かりません。。。

uint8_t u8_a = 1;

uint8_t u8_b = 1;

uint32_t u32 = 1;

//警告出ない

u8_a = (uint8_t)((u32 & 0x0700) >> 8) +

(uint8_t)(u32 & 0x00ff);

//警告出る

u8_a = (uint8_t)((u32 & 0x0700) >> 8) +

(uint8_t)(u32 & 0x00ff) + u8_b;

Parents
  • わわいです

    uint8_t +uint8_t の演算結果はintとなります。

    intの数値をキャスト無しでuint8_t に代入しようとしているため、その警告が出ます。

    で、最初の式で出ないのは、たまたまコンパイラさんががんばってくれているんでしょう。

  • げげげ、、、知らなかった。。。

    ありがとうございました。

    下記のように、2つまでは警告なし。3つのuint8_tの足し算で警告でした。

  • わわいです

    まあ、2つの加算でも、演算結果がオーバーフローする場合があり得るので、本来は警告を出すべきかとは思いますが、そこらへんは考え方しだいなんでしょう。

    そのコンパイラの制作者さんでも出てこないと、そこらへんの事情はわかりませんね

  • ありがとうございます。

    まず2つのuint8_tの値がintに拡張されてから、加算が行われるのですね。

    2つの時と3つの時で警告の有無に差がある理由は良く分かりませんが

    2つならコード書く人が意図的にやってるだろう

    3つなら警告しといてあげよう

    くらいの感じでしょうか。わかりませんが。

    とりあえず解決でございます。

    ありがとうございました。

Reply
  • ありがとうございます。

    まず2つのuint8_tの値がintに拡張されてから、加算が行われるのですね。

    2つの時と3つの時で警告の有無に差がある理由は良く分かりませんが

    2つならコード書く人が意図的にやってるだろう

    3つなら警告しといてあげよう

    くらいの感じでしょうか。わかりませんが。

    とりあえず解決でございます。

    ありがとうございました。

Children
No Data