*p is passed to printf and only inside the printf "%d" comes in to play. So, if we pass only a byte for 'char' and we try to print 4 bytes for 'int' (assuming 32 bit int), we might think result is undefined.
But, C standard says that char is indeed passed as int (as most architecture feature revolve around the size of int). And while converting from char to int, sign extension is used- meaning sign bit is used for all higher order bits. Thus 255 here would be passed to printf as 2^32 - 1 (all 1's). Now, %d gives -1, %u gives 2^32 -1 and %c would give the character corresponding to (2^32 - 1) mod 256 = 255. (actually %c considers just the lower 8 bits and hence mod 256).
But we shouldn't use '%f' and it will give neither the int value converted to float nor the floating point representation corresponding to that value. It'll just give garbage value on most occasion as printf would then be using floating point register to read the value. C standard clearly says this- if the format specifiers are not matching with passed arguments, behaviour is undefined. But character and integer are an exception, as in C character is just a 8 bit integer.
Also, here little endian and big endian would give same result.
(An advise- if you are learning C stuffs by running code, never use online compilers).