Currently, we cast to float in the IntegerArray reducing ops:

https://github.com/pandas-dev/pandas/blob/db620397328567ff8153ae6031685b88c84dc8f8/pandas/core/arrays/integer.py#L673-L678

However, the nanops functions can already handle a mask. So with the appropriate fill_value, there should be no need to cast the integers to float (and check for missing values). At least this is the case for skipna=True, the case of skipna=False might need to be handled separately.