-1
#include <stdio.h>

void fun3(int a, int b, int c)
{
   printf("%d \n", a+b+c );
}
void fun2 ( int x, int y)
{
   fun3(0x33333333,0x30303030, 0x31313131);
   printf("%d \n", x+y);
}
fun1 (int x)
{
   fun2(0x22222222,0x20202020);
   printf("%d  \n", x);
}
main()
{
  fun1(0x1111111);
}

スタックの破損について上記のプログラムを実行しています。上記のプログラムの o/p に望ましくない値が含まれています。私が理解できるのは、追加された値が 0xFFFFFFFF を超えている場合、小さな負の整数が最大値になり、-1 が 0xFFFFFFFF になるということだけです。これに関する洞察

4

3 に答える 3

2

@Cornstalks のポイント: INT_MINis 0x80000000、および(int)-1is0xFFFFFFFFは 2 の補数です (32 ビット システムではとにかく)。

これにより、命令セットは次のような符号付き算術演算を実行できます。

1 + -2 = -1

shortになります (簡潔にするために、署名された s として)

0x0001 + 0xFFFE = 0xFFFF

... それから:

1 + -1 = 0

内部的にはオーバーフローで次のように表されます

0x0001 + 0xFFFF = 0x0000

また、@ Cornstalks のポイント: 内部表現 (およびオーバーフローの追加) は実装の詳細です。C 実装 (および命令セット) は 2 の補数で整数を表す必要がないため、符号付き整数型に 16 進値を指定すると、C 実装のサブセットに関連付けられる場合があります。

于 2013-09-11T02:24:19.417 に答える
2

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

重要:キャストの自動シーケンスは、8 進数および 16 進数の定数に対してのみ有効です。10 進定数については、別の規則があります。

int、long int、long long int。

于 2013-09-11T02:40:35.683 に答える