我们如何在 C 中打印浮点值的编码?我知道我可以使用%A
,但这不是我想要的格式。
例如,如果我的值是 1.3416407,我想打印“0x3FABBAE2”,我不打印“0X1.5775C4P+0”。
我们如何在 C 中打印浮点值的编码?我知道我可以使用%A
,但这不是我想要的格式。
例如,如果我的值是 1.3416407,我想打印“0x3FABBAE2”,我不打印“0X1.5775C4P+0”。
您可以使用联合,例如
#include <stdio.h>
#include <stdint.h>
union {
float f;
uint32_t i;
} u;
u.f = 1.3416407f;
printf("%#X\n", u.i);
@Paul R 提出的联合想法很好,但会随着改进而受益
union {
float f;
uint32_t i;
} u;
u.f = 1.3416407f;
printf("0x%08" PRIX32 "\n", u.i);
这可确保打印 8 个十六进制字符,并根据需要填充零。如果它与 sizeof(int) 不同,它也匹配 sizeof(ui)。
虽然它确实应该受到不常见的 sizeof(float) != sizeof(uint32_t); 的影响。
您可以逐个八位字节遍历八位字节类型:
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("");
您可能需要根据所需的字节顺序以相反的顺序打印八位字节。
要打印任意事物的十六进制表示,请使用
union {
arbitrary object;
unsigned char bytes[sizeof (arbitrary)];
} u;
IE
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
.