(which will ensure a cast to an unsigned long, the biggest unsigned integral type)
Unless size_t is unsigned long or integral promotion makes it an unsigned long, the only thing you ensure is undefined behavior because the type of the value and the type of the format string do not match. The convention is to use an explicit cast:
printf("%lu\n", (unsigned long)sizeof(something));
to make sure that the size will always be displayed correctly on the screen.
If you are lucky. size_t is only guaranteed to be unsigned. It might be an extended type, where there is risk of the value being truncated by casting to unsigned long. The ideal solution is C99's %z modifier:
printf("%zu\n", sizeof(something));
But for C89 compilers the best we can do is cast to the largest possible unsigned type that printf() supports and hope for the best. :)