Не знаете про язык С++, компилятор не при чем.
Типы участвовавшие в операциях целые => результат целый.
Переменной res присваивается уже результат операций.
Так-то оно так, но от Вас я ожидал более глубокого объяснения чем "целый/нецелый".
Еще примерчик для любознательных (которых пока не видно)
C++ (Qt)
unsigned int a = 100;
int b = -2;
float a2 = a - b;
float a3 = b - a;
qDebug() << a2 << a3;
И уж совсем неприличный
C++ (Qt)
float c = 3.14;
qDebug() << (c == 3.14);