如何显示浮点值的编码
我们如何在C中打印浮点值的编码? 我知道我可以使用%A
,但这不是我想要的格式。
例如,如果我的值是1.3416407,我想打印“0x3FABBAE2”,我不是“0X1.5775C4P + 0”。
你可以使用联盟,例如
#include #include union { float f; uint32_t i; } u; uf = 1.3416407f; printf("%#X\n", ui);
@Paul R提出的工会理念很好,但会受益于改进
union { float f; uint32_t i; } u; uf = 1.3416407f; printf("0x%08" PRIX32 "\n", ui);
这确保打印8个hex字符,根据需要填充零。 如果它与sizeof(int)不同,它也匹配sizeof(ui)。
虽然它确实应该受到不常见的sizeof(float)!= sizeof(uint32_t);
要打印任意事物的hex表示,请使用
union { arbitrary object; unsigned char bytes[sizeof (arbitrary)]; } u;
即
union { float object; unsigned char bytes[sizeof (float)]; } u; u.object = 1.3416407f; printf("0x"); for (size_t i = 0; i < sizeof(u.bytes); i++) { printf("%02hhx", u.bytes[i]); } printf("\n");
或者反转小端的字节:
printf("0x"); for (size_t i = sizeof(u.bytes) - 1; i < sizeof(u.bytes); i--) { printf("%02hhx", u.bytes[i]); } printf("\n");
上面的代码假设CHAR_BIT == 8
。
您可以通过八位字节走八位字节:
float f = 1.3416407; unsigned char *fp = (void *)&f; size_t i; printf("0x"); for (i = 0; i < sizeof(float); ++i) { printf("%02X", fp[i]); } puts("");
您可能需要根据所需的字节顺序以相反的顺序打印八位字节。