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 回答
1

int无法存储无限大的数字。当total变得太大而无法存储在 中时int,该值将环绕到int' 范围的另一侧。

在大多数系统上,一个int变量使用 32 位内存来保存。这使它的范围为 -2147483648 到 2147483647。

如果您int已经持有 2147483647 的值并且您添加 1,则结果将是 -2147483648!

因此,如果您想计算“平均指针值”,您需要将总和存储在int比回答)。

于 2013-06-24T07:36:52.027 回答