我已经包含了一些代码,可以产生十六进制输出,我认为这可能有助于您理解浮点数。以下是一个例子:
double: 00 00 A4 0F 0D 4B 72 42 (1257096936000.000000) (+0x1.24B0D0FA40000 x 2^40)
从下面的代码示例中,您应该很容易就能明白如何输出位。将双精度浮点数的地址转换为unsigned char *
,并输出sizeof(double)
个字符的位。
由于我想要输出浮点数的指数和有效数字(以及符号位),我的示例代码深入挖掘了IEEE-754标准表示64位“双精度”浮点数在基数2中的位。因此,除了验证编译器和我都同意double
表示64位浮点数之外,我不使用sizeof(double)
。
如果您想要输出任何类型的浮点数的位,请使用sizeof(double)
而不是8
。
void hexdump_ieee754_double_x86(double dbl)
{
LONGLONG ll = 0;
char * pch = (char *)≪
int i;
int exponent = 0;
assert(8 == sizeof(dbl));
exponent = (((((char *)&(dbl))[7] & 0x7F) << 4) + ((((char *)&(dbl))[6] & 0xF0) >> 4) & 0x7FF) - 0x3FF;
for (i = 0; i < 6; i ++)
*pch++ = ((char *)&(dbl))[i];
*pch++ = ((char *)&(dbl))[6] & 0xF;
printf("double: %02X %02X %02X %02X %02X %02X %02X %02X (%f)",
((unsigned char *)&(dbl))[0],
((unsigned char *)&(dbl))[1],
((unsigned char *)&(dbl))[2],
((unsigned char *)&(dbl))[3],
((unsigned char *)&(dbl))[4],
((unsigned char *)&(dbl))[5],
((unsigned char *)&(dbl))[6],
((unsigned char *)&(dbl))[7],
dbl);
printf( "\t(%c0x1.%05X%08X x 2^%d)\n",
(((char *)&(dbl))[6] & 0x80) ? '-' : '+',
(DWORD)((ll & 0xFFFFFFFF00000000LL) >> 32),
(DWORD)(ll & 0xFFFFFFFFLL),
exponent);
}
请注意:有效数字以十六进制小数(“0x1.24B0D0FA40000”)显示,指数以十进制(“40”)显示。对我来说,这是一种直观显示浮点位的方式。
if (buf == 0) return 0; else return 1;
}int main() { int a = 289642;// 以二进制表示a int i = 0; for (i = 31; i>=0; i--) { printf("%d",bit_return(a,i)); } return 0;
} - user188276