編集(訂正)(ポイントを逃しました。私の答えは定数に対して正しいですが、質問には関数のパラメーターが含まれています。ここで何が起こるかは、署名された整数オブジェクトのオーバーフローであり、コメントで@Cornstalksが正しく指摘したように、これは未定義です行動)。
/編集
fun1()
あなたは間違った方法で使用しprintf()
ています。
あなたは"%d"
を受け入れると書きましたint
が、あなたの数が より大きい場合、これは当てはまりませんMAX_INT
。
システムでの値を確認する必要がありMAX_INT
ます。
整数定数を 16 進形式で記述する場合、標準 C (ISO C99 または C11) は、次の順序に従って、定数が収まる最初の型に値を入れようとします。
int、unsigned int、long int、unsigned long int、long long int、unsigned long long int。
したがって、MAX_INT
( の範囲内の最大値int
) より大きい定数がある場合、その定数 (正の場合) は typeunsigned int
ですが、ディレクティブは値を%d
予期していましたsigned int
。したがって、負の数が表示されます。
UMAX_INT
最悪の場合、定数が( の範囲内の最大値) より大きい値である場合、定数unsigned int
の型は の最初のものになりlong int, unsigned long int, long long int
、精度は の より厳密に大きくなりunsigned int
ます。
これは、それ%d
が間違ったディレクティブになることを意味します。
値の大きさが完全にわからない場合は、最大の整数型にキャストできます。
printf("%lld", (long long int) 0x33333333333);
ディレクティブ%lld
はの略ですlong long int
。
常に正の値に関心がある場合は、次を使用%llu
してキャストする必要がありunsigned long long int
ます。
printf("%llu", (unsigned long long int) 0x33333333333);
このようにして、「おかしな」数値を回避し、精度を失うことなく大きな数値を表示できます。
注意:定数INT_MAX
、UINT_MAX
などはlimits.hにあります。
重要:キャストの自動シーケンスは、8 進数および 16 進数の定数に対してのみ有効です。10 進定数については、別の規則があります。
int、long int、long long int。