0

私はポインターをいじっています。例として、コードは次のとおりです。

int foo = 25;
int * bar = &foo;
cout << (unsigned long int) bar;

実行すると何かが出力3216952416されます。

では、このコードを実行すると、なぜこのような低い数値、さらには負の数値が出力されるのでしょうか?

int total = 0, amount = 0;

for( int i = 0; i < 100000; i++ )
{
    int foo = 25;
    int * bar = &foo;

    total += (unsigned long int) bar;
    amount++;
}

cout << "Average pointer position of foo: " << total / amount << endl;

それはおそらく単純なものです...

4

2 に答える 2

1

まず、変数アドレス (ポインターの値) は符号なしです。符号付き整数を使用して計算しています。範囲がシフトし、負の値が発生する可能性があることを説明しています。第二に、使用すると確かにオーバーフローします

total += (unsigned long int) bar;

、したがって、任意の値が可能です。

total の型が であるため、キャストは役に立ちませんint。別の暗黙のキャストが実行されます。

totalの型を unsigned long intに変更しようとすることはできますが、これでは十分ではありません。オーバーフローを避けるために、合計の比率ではなく、比率の合計を行う必要があります

double amount = 100000;
double average= 0;

for( int i = 0; i < amount; i++ )
{
    int foo = 25;
    int * bar = &foo;

    average += (((unsigned long int) bar)/amount);
}

cout << "Average pointer position of foo: " << (unsigned long int)average << endl;
于 2013-06-24T07:14:04.600 に答える