このブログの「符号付き整数と符号なし整数を混在させるとどうなりますか?」のコード スニペットから動機付けられました。符号付き整数と符号なし整数のいくつかの異なる値で実行し、動作を観察することにしました。
これが元のスニペットです (わずかに変更されていますが、意図は同じです)
#include <stdio.h>
int main(void)
{
unsigned int a = 6;
int b = -20;
int c = (a+b > 6);
unsigned int d = a+b;
printf("<%d,%u>", c, d);
}
出力: <1,4294967282>
今、同じプログラムを実行するa = 6
とb = -1
出力: <0,5>
C 言語の整数昇格規則を正しく理解していればb=-1
、符号なし整数に昇格する必要がありました4294967295
。元の例の場合と同様に、 を取得する必要があります<1,4294967301>
。しかし、それは私たちが得たものではありません。
私が考えることができるこの動作の唯一の理由は、これらの暗黙的な型変換が算術演算の後に発生することです。ただし、同じブログ投稿には、符号付き整数が最初に昇格されてから評価が行われるとも書かれており、これは私の推論を無効にします。
この行動の本当の理由は何ですか?そして、2 つの例が互いにどのように異なるか。
PS私は、この問題に類似/関連するSOに関する多くの質問があることを理解しています。しかし、特にこの問題に対処したり、そのようなコード スニペットを理解するのに役立つ質問に出くわしたことはありません。重複が見つかった場合は、この質問をクローズすることを喜んで受け入れます。