編集(訂正)(ポイントを逃しました。私の答えは定数に対して正しいですが、質問には関数のパラメーターが含まれています。ここで何が起こるかは、署名された整数オブジェクトのオーバーフローであり、コメントで@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。