我编写了一些c代码来处理内存中的浮点值,但最终从带有-std=c11选项的"GCC(GCC)12.1.1 20220730"的printf编译中得到了一些意外的输出.
I have no idea why it's behaving like this and would like to know what's happening, if I'm doing something wrong and how do I get it to printf a float value as hex if it's possible without converting it to another type first?个
下面是使用的代码和不同运行的输出.
代码:
#include <stdio.h>
int main()
{
float f3 = 1.1;
float f4 = 1.0;
unsigned char *t1 = &f3;
unsigned *t2 = &f3;
printf("P1: %x\n", t2[0]);
printf("P2: %x %x %x %x\n", t1[0], t1[1], t1[2], t1[3]);
printf("P3: %p\n", &f3);
printf("P4: %lx, %lx, %llx\n", &f3, f3, f4);
printf("T1: %f, %f, %lx, %lx\n", f3, f4, f4, f3);
printf("T2: %x, %lx\n", f4, f3);
printf("T3: %x, %lx\n", f3, f4);
return 0;
}
主要问题似乎是将浮点数打印为十六进制:
printf("%x\n", f3);
输出1:输出1:
P1: 3f8ccccd // as expected
P2: cd cc 8c 3f // as expected
P3: 0x7ffc667d4d40 // as expected
P4: 7ffc667d4d40, 3ff19999a0000000, 0 // pointer value as expected, but second and third isn't. Values stay the same after each run
T1: 1.100000, 1.000000, 5556db09b2a0, 0 // first two values as expected, second and third isn't, Values do not stay the same after each run
T2: db09b2a0, 0 // this value keeps changing after each run
T3: db09b2a0, 0 // same as above, but should be different? Also changes after each run.
输出2:输出2:
P1: 3f8ccccd
P2: cd cc 8c 3f
P3: 0x7ffef87ebb00
P4: 7ffef87ebb00, 3ff19999a0000000, 0
T1: 1.100000, 1.000000, 55fb6a1962a0, 0
T2: 6a1962a0, 0
T3: 6a1962a0, 0
输出3:以下内容:
P1: 3f8ccccd
P2: cd cc 8c 3f
P3: 0x7ffdb2026640
P4: 7ffdb2026640, 3ff19999a0000000, 0
T1: 1.100000, 1.000000, 564dd210c2a0, 0
T2: d210c2a0, 0
T3: d210c2a0, 0