In almost all programming languages there is an implied and automatic conversion between compatible types.
The rule that is normally used is to convert all data types of an expression to the 'supertype' of them. Normally in C all integers will be converted in floats or doubles if thhey are operated against one of them, but this is n ot your case because you are dividing two homogenous types data, two integers. So happen that the code performs an integer division, then in the assignement, where it will found a float, the former result is converted to float (promoted) then assigned.
In the second example you have made a 'cast' forcing the compiler to convert the first integer to float. In this case the division is between two unhomogenous types, which supertype is the float. The compiler then will first convert the divisor to float than perform a floating point division and assign result.
This link describes very well the whole process for many languages.
About your second question I have not understood if you mean "Why I need casting in this piece of code" or "why I need such a feature in the language". In the first case you need to cast it because your expression is an integer expression assigned to a float, so it must be calculated as integere than converted to be assigned. Casting you are telling to the compiler this is a mixed float expression and I want it calculated as float.
For the second case the answer is implicit in the first case.