Zasadniczo, rzutowanie (char) i inne, podobne rzutowania, nie konwertują niczego, a jedynie mówią kompilatorowi, żeby traktował zmienną jako zmienną jakiegoś określonego typu. Tak jakby dać mu zamknięte pudełko i powiedzieć: nie widzisz co jest w pudełku, ale ja Ci mówię że jest tam dynamit, więc traktuj to pudełko jak pudełko z dynamitem.
Konwersja z użyciem Convert() z kolei działa w ten sposób, że próbuje zmienić jeden typ w drugi. Tak jakby dać kompilatorowi kłębek wełny i powiedzieć: masz kłębek wełny, spróbuj mi zrobić z tego szalik. A on albo zrobi i powie OK, albo nie zrobi i powie: nie da się, za mało wełny
Wracając do technicznej części, przyjrzyj się temu przykładowi:
Zaloguj się, aby zobaczyć kod
Inny przykład to traktowanie wartości null:
Zaloguj się, aby zobaczyć kod
Tyle jeżeli chodzi o różnice w rzutowaniu i konwersji, natomiast Twój problem polega na czy innym. Chodzi o to, jaką liczbę tak naprawdę do tablicy zapisujesz.
Skoro, jak piszesz, wynikiem działania zmienna_int % 10 jest liczba 4, to powinieneś przesyłać w tablicy liczbę 4, a tymczasem dodając + '0' przesyłasz 52.
Uruchom i przeanalizuj przykład, może coś rozjaśni:
Zaloguj się, aby zobaczyć kod
Podejrzyj też tablicę ASCII (pierwszy link z googla) i zobacz jaką wartość DEC ma znak '0'.