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

您的第一个程序似乎可以工作而您的第二个程序没有工作的原因是,对于您的特定硬件,float 的大小与 int 相同,而 int 没有足够的空间容纳 a 中的所有位double

但是您已经违反了严格的别名规则,因此,如果您真的想打印浮点类型的位,正确的方法是强制转换为unsigned char*然后迭代 char 的每一位,同时在每个位上递增指针底层浮点类型的字节。另请注意,在 big-vs-little endian 上,您的程序的结果可能会有所不同。

于 2013-01-15T00:04:32.643 回答