Because in the first, the (int) applies to start, not the expression, like this:
int diff = ((int) start) - stop; // <== Your first expression clarified
Then you subtract a long from the resulting int, and the result of that expression is a long. (If it had worked, it probably would have had the side-effect of giving you an incorrect result, if start ever has values that are too big to store in an int.)
By first doing the subtraction and getting the long result, then casting that to int, you can store it in your int variable. (Presumably you know it'll fit from your application logic.)