0

フロートのビット表現を知るために、期待どおりに機能するこのプログラムを実行しました。

float x1=-675.78125;
int *pint1;
pint1=(int *)&x1;


for(int i=0;i<8*sizeof(float);i++)
{

if(*pint1&1)
{
    cout<<1;
    }
else
    cout<<0;
    *pint1>>=1;

}

しかし、ダブルでは機能しません:

double x=-675.78125;
int *pint;
pint=(int *)&x;

for(int i=0;i<8*sizeof(double);i++)
{

    if(*pint&1)
    {
        cout<<1;
        }
    else
        cout<<0;
        *pint>>=1;

    }

なぜそうなのか説明していただけますか?どのようにしますか?手伝ってくれてどうもありがとう。

4

1 に答える 1

3

最初のプログラムが機能するように見えて 2 番目のプログラムが機能しない理由は、特定のハードウェアでは、float のサイズが int と同じであるのに対し、int には a のすべてのビットに十分なスペースがないためdoubleです。

しかし、あなたはすでに厳密なエイリアシング規則に違反しているので、浮動小数点型のビットを本当に出力したい場合はunsigned char*、char の各ビットにキャストしてから、ポインターをインクリメントしながら各ビットを反復処理するのが正しい方法です。基礎となる浮動小数点型のバイト。また、ビッグエンディアンとリトルエンディアンでは、プログラムの結果が異なる場合があることに注意してください。

于 2013-01-15T00:04:32.643 に答える