1. ホーム
  2. c

[解決済み] 最小のint型である-2147483648はなぜ'long'型なのでしょうか?[重複しています]。

2022-04-24 01:08:27

質問

学校の課題で、C言語のprintf関数をコーディングしなければなりません。物事はかなりうまくいっているのですが、1つだけ良い答えが見つからない質問があるので、ここに書いておきます。

printf("PRINTF(d) \t: %d\n", -2147483648);

が教えてくれる( gcc -Werror -Wextra -Wall ):

   error: format specifies type 'int' but the argument has type 'long'
      [-Werror,-Wformat]
        printf("PRINTF(d) \t: %d\n", -2147483648);
                              ~~     ^~~~~~~~~~~
                              %ld

しかし、int型変数を使用すると、すべてがうまくいくのです。

int i;

i = -2147483648;
printf("%d", i);

なぜ?

EDITです。

いろいろな点が理解でき、大変興味深かったです。とにかく、私は printf が使っているのは <stdarg.h> librairyなどです。 va_arg(va_list ap, type) も正しい型を返すはずです。例えば %d%i の場合、明らかに返される型は int . 何か変化があるのでしょうか?

解決方法は?

C言語では -2147483648 は整数の定数ではありません。 2147483648 は整数定数であり - は単項演算子を適用しただけのもので、定数式が得られます。の値は 2147483648 には収まりません。 int (一つ大きすぎる。 2147483647 は一般的に最大の整数である)、したがって、整数定数はタイプ long そのため、このような問題が発生します。の下限値について言及したい場合、その下限値は int を使用するか、マクロ INT_MIN から <limits.h> (ポータブルな方法)、または慎重に 2147483648 :

printf("PRINTF(d) \t: %d\n", -1 - 2147483647);