Given the following program:
#include <stdio.h>
int main(int argc, char** argv)
{
int i;
void* p = &i;
printf("No cast, using %%p: %p\n",
p);
printf("Cast to unsigned long using conversion %%lx: %lx\n",
(unsigned long) p);
printf("Cast to unsigned long long using conversion %%llx: %llx\n",
(unsigned long long) p);
printf("Cast to unsigned long then unsigned long long using conversion %%llx: %llx\n",
(unsigned long long) (unsigned long) p);
return 0;
}
What would one expect the output to be? Compiling with GCC 4.4.7 and running the program given the following output:
No cast, using %p: 0xbf8aa3d8
Cast to unsigned long using conversion %lx: bf8aa3d8
Cast to unsigned long long using conversion %llx: ffffffffbf8aa3d8
Cast to unsigned long then unsigned long long using conversion %llx: bf8aa3d8
Compiling with clang version 3.4 and running the program yields what I would actually expect:
No cast, using %p: 0xbfa64234
Cast to unsigned long using conversion %lx: bfa64234
Cast to unsigned long long using conversion %llx: bfa64234
Cast to unsigned long then unsigned long long using conversion %llx: bfa64234
It would appear that GCC has padded the most significant bits with 1's instead of 0's when converting directly from pointer to unsigned long long. Is this a bug in GCC?