Number of bytes per type is determined by the compiler. If you are running on a 64bit platform but are expecting 8 bytes (for 'long'), you need to set the appropriate compiler flag.
The first printf will print the size of an int (the type of the variable i; note that the assignment of the long value 10L to i does not change i's type; on systems where longs have more bits than ints, it would simply mean that the value would be truncated on assignment). On most modern systems, this would be 4 bytes.
The second printf prints the size of a long (the type of j). On 32-bit systems, this would be 4 bytes; on 64-bit Windows with Microsoft Visual C++, this would be 4 bytes; on 64-bit Linux (GNU C compiler), 8 bytes.
The third printf prints the size of an int again (the type of k), i.e., 4 bytes on most systems.
The fourth printf prints the size of an int (the type of the temporary value created when j is typecast to int before the application of the sizeof() operator), i.e., once again 4 bytes on most modern systems.
So on Windows with Visual C++ (32-bit, 64-bit) the program prints the number 4 four times; same thing on 32-bit Linux (GNU C), but on 64-bit Linux, it would print 4, 8, 4, 4. Other platforms/compilers may behave differently, and compiler flags may also affect the behavior.