C and D are incorrect because a short and a byte can both be assigned negative values. Since a char is unsigned, the compiler will complain.
B is correct because the range of a float covers the complete range of the long. Now, you can argue that the float has less precision than a long (especially since it is only 32 bit versus 64 bit for long) -- however,
Java doesn't check for loss of precision for implicit casts.
Henry