4

ここで浮動小数点数の絶対値を見つけるためのアルゴリズム。これはどのように作動しますか?

//find absolute value
double x;
*(((int *) &x) + 1) &= 0x7fffffff;

1 のオフセットが必要だった理由がわかりません。それは言います:

IA32 64 ビット符号ビットは、+1 の int アドレス オフセットで 0x80000000 です。

誰かがこれを分解して説明できますか?

4

3 に答える 3

8

このコードは厳密なエイリアシング規則に違反しているため、技術的に無効な C です。ただし、エイリアス規則を乱用しないようにコンパイラに指示すると、x86 と同じようにdoubles とs がメモリ内に配置されることが保証されます。int

(int *)&xへのポインタxです。1 を追加すると、ポインタが 4 バイト前方に移動します。それを逆参照すると、 の 4 ~ 7 バイト目が得られますdouble。の最後のバイトであるため、これの上位ビットをマスクしますdouble

char *ちなみに、a を使用して1 の代わりに 7 を追加することで、これがエイリアシング違反になるのを防ぐことができます。

于 2013-08-20T05:33:07.673 に答える
7

Adoubleは 8 バイト幅で、次の形式です。

ここに画像の説明を入力

int表示するコードは、幅が 4 バイトであり、 と の両方intdoubleリトルエンディアンであることを前提としています(つまり、ビット 0 ~ 7 はバイト 0 に格納され、ビット 8 ~ 15 はバイト 1 などに格納されます)。

xへのポインターの場合double:

*(((int *) &x) + 0) addresses bits 0 through 31;
*(((int *) &x) + 1) addresses bits 32 through 63.

したがって、*(((int *) &x) + 1) &= 0x7fffffffビット 63 をゼロに設定xし、その絶対値に変更します。

于 2013-08-20T05:34:33.493 に答える
1

これはプラットフォームに大きく依存します。

とにかく、最上位ビットが符号ビットである double があります。

double が 8 バイトで int が 4 バイトで、LE システムを使用している場合、最上位ビットは最後のバイトまたは 2 番目の整数の最上位ビットです。

したがって、2 番目の整数 ( と書くこともできます((int *)&x)[1] &= 0x7fffffff) を取り、その最上位ビットをクリアします。

于 2013-08-20T05:33:45.263 に答える