将int作为float打印时printf的行为是什么?

ada*_*ada 1 c floating-point int printf casting

我在windows7上使用dev cpp来编译我的代码.

int d = 0x12;
char* e = (char*)&d;
printf("%d %d\n", sizeof (int), sizeof (float));
printf("%p %p\n", &d, (float*)&d);
printf("%p %p %p %p %p\n", &d, &e[0], &e[1], &e[2], &e[3]);
printf(" %d | %x | %#1x | %#1x | %#1x |%p\n", d,  e[0], e[1], e[2], e[3], &e[0]);
getchar();

4 4 
0028FF40 0028FF40
0028FF40 0028FF40 0028FF41 0028FF42 0028FF43  
18 | 12 | 0 | 0 | 0 |0028FF40
Run Code Online (Sandbox Code Playgroud)

你看,如果我使用%d打印d,它打印4个字节的精细.但是,如果我使用下面的%f,它会在必须打印e的第一个字节的位置显示零.任何人都可以帮助解决为什么会这样 为什么e的内容取决于d的格式?

int d = 0x12;
char* e = (char*)&d;
printf("%d %d\n", sizeof (int), sizeof (float));
printf("%p %p\n", &d, (float*)&d);
printf("%p %p %p %p %p\n", &d, &e[0], &e[1], &e[2], &e[3]);
printf(" %f | %x | %#1x | %#1x | %#1x |%p\n", d,  e[0], e[1], e[2], e[3], &e[0]);
getchar();
Run Code Online (Sandbox Code Playgroud)

输出是:

4 4
0028FF40 0028FF40
0028FF40 0028FF40 0028FF41 0028FF42 0028FF43
 0.000000 | 0 | 0 | 0 | 0x28ff40 |76869F1D
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 8

未定义的行为.

在实践中,你看到的可能是由于这样的事实%f,使printfdouble从它的参数列表,这是8个字节*.但是d只有4个字节,所以现在一切都没有对齐.

请记住,这printf是一个可变函数,这意味着它完全是非类型安全的; printf必须在没有编译器帮助的情况下从堆栈中提取原始字节.确保参数与格式字符串完全对应完全取决于您.


*可能.