BUG: setting with iloc and no labels does not effect certain data types
- [x] I have checked that this issue has not already been reported.

- [x] I have confirmed this bug exists on the latest version of pandas.

- [x] (optional) I have confirmed this bug exists on the master branch of pandas.

---

#### Code Sample, a copy-pastable example

```python
df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}, dtype="int64")
df.iloc[:, 0:1] = df.iloc[:, 0:1].astype("int32").values
print(df.dtypes)
```

Column "a" remains an int64 whereas it should be int32. This is similar to #33198, however the resolution there (taking the split path in _setitem_with_indexer) is not sufficient in this case where there are no labels. The issue appears to be the function

https://github.com/pandas-dev/pandas/blob/9f7b9fce94476c973652c7e42293c2e5086287ef/pandas/core/dtypes/cast.py#L86-L95

values enters here as int32 and gets converted to int64 in the call to maybe_convert_objects. Indeed, adding the line

    values = values.astype(np.int32)

after the call to maybe_convert_objects gives the right output.

Should maybe_convert_objects take into account int32 vs int64, float32 vs float64, and others?

One last note: even if maybe_convert_objects returned int32 here, it would not resolve #33198.