Well, this is all nitpicking. We could argue all day about (char *) versus (unsigned char *) and whether it should have emitted one warning or two, but this is ignoring the real failure here. The real failure here is that the entire program is one gigantic type violation; the whole point of the program is to take a float and print it out as if it were an array of chars. The program is printing out floats as if they were strings, and all the compiler can find to complain about is this ridiculous triviality about the signedness of the characters I want to print out.
I call that a big fat failure.