Geert Uytterhoeven wrote: [snip] > > > Strangely, this is actually "correct" behavior. Arguments on > > > variable-length argument lists are implicitly "promoted" to unsigned > > > int at the widest. See K&R 2nd ed. A6.1 and A7.3.2. > > > > Ugh. Thanks for pointing this out. I wasn't aware of it. > > > > printf("%016Lx\n", ~a); > > > > Produces the expected output. So it is actually an implementation > > bug in binutils, which isn't fixable for 2.14 and earlier, because > > those have to remain at K&R C level. The K&R requirement was only > > recenly loosened. > > How can it print the correct output if ~a is `promoted' to unsigned int, while > you specify %Lx in the format string? >From 'info gcc': Double-Word Integers ==================== ISO C99 supports data types for integers that are at least 64 bits wide, and as an extension GCC supports them in C89 mode and in C++. [...] There may be pitfalls when you use `long long' types for function arguments, unless you declare function prototypes. If a function expects type `int' for its argument, and you pass a value of type `long long int', confusion will result because the caller and the subroutine will disagree about the number of bytes for the argument. Likewise, if the function expects `long long int' and you pass `int'. The best way to avoid such problems is to use prototypes. Thiemo