C言語のUINT_MAXについて


C言語のプログラムについての質問です。  
以下のプログラムがあります。

[code]

    #include <stdio.h>
    #include <limits.h>
    
    int main(void)
    {
        int n = UINT_MAX;
        if (n + 1) {
            puts("true");
        }
    }
    
[/code]

このプログラムを実行すると、何も出力されないことになっています。  
7行目でなぜ0になるか理解できません。  
msys2を使用していて、コンパイラはgccで、デバッガはgdbです。  
VSCodeのバージョンは、1.76.1です。

試したこと

  1. ブレークポイントを6行目に置いて、デバッグをしました。しかし、n = 0と表示されます。
  2. このプログラムは、本に書いてあり、解説を読みました。`unsigned int型のUINT_MAXは、int型の-1となるため、条件式は-1+1で0となる。`とのことです。

どうかよろしくお願いします。




`UINT_MAX` は `unsigned int` で表現できる値の最大値です。 `int` で表せる範囲を超えています。

`unsigned int` から `int` への型変換が起こるとき、元の値を変換後の型で表せなければその結果は処理系定義ということになっています。
処理系定義というのはコンパイラごとに違う結果になってもよい (ただしどういう結果になるのかはコンパイラの資料として文書化されるべき) という意味です。

GCC
の文書によれば[符号付き整数は二の補数のみをサポート](https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Integers-
implementation.html)しているので `UINT_MAX` のビットパターンを `int` として読み替えると `-1` となります。

[二の補数](https://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0)を理解していれば自然な動作であることがわかると思います。




`UINT_MAX` は `unsigned int` で表現できる値の最大値です。 `int` で表せる範囲を超えています。

`unsigned int` から `int` への型変換が起こるとき、元の値を変換後の型で表せなければその結果は処理系定義ということになっています。
処理系定義というのはコンパイラごとに違う結果になってもよい (ただしどういう結果になるのかはコンパイラの資料として文書化されるべき) という意味です。

GCC
の文書によれば[符号付き整数は二の補数のみをサポート](https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Integers-
implementation.html)しているので `UINT_MAX` のビットパターンを `int` として読み替えると `-1` となります。

[二の補数](https://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0)を理解していれば自然な動作であることがわかると思います。

