test.c:4: warning: return type defaults to `int' test.c: In function `main': test.c:15: warning: int format, double arg (arg 3) test.c:16: warning: int format, double arg (arg 2) test.c:18: warning: int format, double arg (arg 2) test.c:18: warning: int format, double arg (arg 3) test.c:20: warning: control reaches end of non-void function
Looks like maybe the floats are automatically promoted to doubles before they are passed to printf. I don't know if that's standard behaviour, but it seems reasonable. So then in the first case, two 64-bit values are put on the stack, and two 64-bit values are taken off the stack.
In the second case, two 64-bit values are put on the stack, one 64-bit value is taken off the stack and presented correctly, and one 64-bit value has only the first 32 bits read, and misinterpreted as a signed int.
In the third case, two 64-bit values are put on the stack, and the first 32 bits are interpreted as the first signed int, and the second next 64 are interpreted as a double. So case 3 is different from case 2 in that the double value in case 3 is made up of two halves of two different doubles, while in case 2 the double is made from an actual double.
Or something like that.
-- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/