【发布时间】:2011-09-15 13:20:20
【问题描述】:
好的,我之前遇到过这种情况,变量会因为内存分配问题或错误寻址等而随机更改数字,例如当您超出数组范围时。但是,我没有使用数组、指针或地址,所以我不知道为什么在执行此循环后它突然决定设置为0 后的“指数”等于循环内的288:
编辑:它决定具体中断:0x80800000。
这不会在一个测试中中断,我们有一个“测试”客户端,它遍历几个测试用例,每次它再次调用它,每次再次调用函数时,值应该是设置为等于它们的原始值。
/*
* float_i2f - Return bit-level equivalent of expression (float) x
* Result is returned as unsigned int, but
* it is to be interpreted as the bit-level representation of a
* single-precision floating point values.
* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
* Max ops: 30
* Rating: 4
*/
unsigned float_i2f(int x) {
int sign= 0;
int a=0;
int exponent=0;
int crash_test=0;
int exp=0;
int fraction=0;
int counter=0;
if (x == 0) return 0;
if (!(x ^ (0x01 << 31)))
{
return 0xCF << 24;
}
if (x>>31)
{
sign = 0xFF << 31;
x = (~x) + 1;
}
else
{
sign = 0x00;
}
//printf(" After : %x ", x);
a = 1;
exponent = 0;
crash_test = 0;
while ((a*2) <= x)
{
if (a == 0) a =1;
if (a == 1) crash_test = exponent;
/*
if(exponent == 288)
{exponent =0;
counter ++;
if(counter <=2)
printf("WENT OVERBOARD WTF %d ORIGINAL %d", a, crash_test);
}
*/
if (exponent > 300) break;
exponent ++;
a *= 2;
}
exp = (exponent + 0x7F) << 23;
fraction = (~(((0x01)<< 31) >> 7)) & (x << (25 - (exponent + 1)));
return sign | exp | fraction;
}
【问题讨论】:
-
我会在调试代码的过程中添加
cout <<进度,因为我看不懂。 -
这是会产生错误的最小示例吗?
-
在 288 次迭代之后,正是它将等于...
-
导致这种情况的 x 的违规值是什么?它只发生在 x 的一个值上吗?
-
嗯,你知道你只是在循环中循环并增加指数,所以最终它会达到 288。它可能会发生得非常快,因为这些天循环很快(没有更多使用仓鼠的机械计算器旋转巴贝奇时代使用的齿轮)。