これは、メモリ割り当ての問題や配列の範囲外に出たときのようなアドレス指定の誤りなどのために、変数がランダムに数値を変更する前に私に起こっていました。狂ったように、なぜ私の変数が変わっていますか?
編集:私はこのループを実行した後、それは突然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 <<'の進捗を追加したいと思います。 – Blender
このエラーは最小限の例ですか? – Beta
288回反復した後、それは*正確に*等しいとなるでしょう... –