Если предположить, что это C или аналог (например, цель C), измените:
res = b / c;
до:
res = b / (int)c;
Объяснение: b преобразуется из int
в unsigned int
в соответствии с правилами преобразования типов C для смешанных выражений. В процессе он переполняется от -25
до 0xFFFFFFE7 == 4294967271
. Затем вы получите unsigned int
результат 4294967271 / 5U = 858993454U
, который затем неявно преобразуется обратно в int
(на этом шаге переполнения нет, поскольку результат находится в диапазоне как 32-разрядных со знаком, так и без знака).
Кстати, результат float
должен быть таким же, в пределах точности float
(я получаю 858993472.0
). Я удивлен, что вы получаете -5,0 в этом случае.