我做了这个程序,它按预期运行,以了解float的位表示:
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;
}
你能解释一下为什么会这样吗?你会怎么做?非常感谢你的帮助。
答案 0 :(得分:3)
你的第一个程序似乎工作而第二个程序不起作用的原因是你的特定硬件,浮点数的大小与int相同,而int没有足够的空间容纳所有位double
。
但是你已经违反了严格的别名规则,所以如果你真的想打印一个浮点类型的位,正确的方法是转换为unsigned char*
然后迭代每一位将指针递增到底层浮点类型的每个字节时的char。另请注意,在big-vs-little endian上,您的程序结果可能会有所不同。