Магия int при делении на float?
Цифры странные берутся, когда в ячейке памяти хранится один тип, а printf ожидает увидеть другой, потому неправильно представляет его. Округлять или ещё как-нибудь преобразовывать типы за вас printf не будет, что ему скажут, то он и выведет.
а затем в printf вывести через символ преобразования для целых чисел, то есть %d
Это не символ преобразования, ничего не преобразуется: вы сами сообщаете (обманываете)  printf о типе переданных данных.
Преобразование выполняется как-то так
printf("%d", (int)(b*a));