上の式は警告が出ないのに、下の式は警告が出る理由が分かりません。。。
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);
//警告出る
(uint8_t)(u32 & 0x00ff) + u8_b;
わわいです
uint8_t +uint8_t の演算結果はintとなります。
intの数値をキャスト無しでuint8_t に代入しようとしているため、その警告が出ます。
で、最初の式で出ないのは、たまたまコンパイラさんががんばってくれているんでしょう。
げげげ、、、知らなかった。。。
ありがとうございました。
下記のように、2つまでは警告なし。3つのuint8_tの足し算で警告でした。
まあ、2つの加算でも、演算結果がオーバーフローする場合があり得るので、本来は警告を出すべきかとは思いますが、そこらへんは考え方しだいなんでしょう。
そのコンパイラの制作者さんでも出てこないと、そこらへんの事情はわかりませんね
https://www.jpcert.or.jp/sc-rules/c-int02-c.htmlここに解説があります
ありがとうございます。
まず2つのuint8_tの値がintに拡張されてから、加算が行われるのですね。
2つの時と3つの時で警告の有無に差がある理由は良く分かりませんが
2つならコード書く人が意図的にやってるだろう
3つなら警告しといてあげよう
くらいの感じでしょうか。わかりませんが。
とりあえず解決でございます。