i = (float)i;
— Так как переменная слева
i имеет тип 
int, то значение выражения справа 
(float)i будет при присваивании преобразовываться обратно в 
int.
printf("%f", i);
— Область памяти, начинающаяся с адреса, по которому в стек при вызове 
printf пемещается значение типа 
int переменной 
i (и, соответственно, занимающая 
sizeof (int) байт) интерпретируется как хранящая значение типа 
float (размером 
sizeof (float) байт и захватывающая дополнительно посторонний мусор из стека). Т. е. это даже не арифметическое (пусть даже с округлением) преобразование.
Должно работать:
int main() {
    int i = 1;
    printf("%f", (float)i); // выводим на экран float
return 0;
}