我正在摆弄指针,例如,代码:
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;
这可能很简单...
答案 0 :(得分:1)
首先,变量地址(指针的值)是无符号的。您使用有符号整数进行计算。它解释了范围发生了变化,并且可能出现负值。其次,当你使用
时,你肯定会溢出total += (unsigned long int) bar;
,所以任何价值都是可能的。
您的演员表无用,因为总计类型为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;
答案 1 :(得分:1)
int
无法存储无限大的数字。当total
变得太大而无法存储在int
中时,该值会回绕到int
范围的另一边。
在大多数系统上,使用32位内存保存int
变量。这使它的范围为-2147483648到2147483647。
如果您的int
已经拥有值2147483647并且您添加1,则结果为-2147483648!
因此,如果您想计算&#34;平均指针值&#34;,您需要将您的总和存储在比int
大得多的数据中,或者进行计算以使您不必需要存储所有指针值的总和(例如,UmNyobe&#39;答案)。