il comportamento che riscontri dipende dal fatto che un char occupa un byte di memoria e un int ne occupa almeno 2.
Dovresti fare un debuggingperchè il comportamento dipende dal compilatore, ma probabilmente il tuo compilatore alloca prima la memoria per op2 e un char affianco quella per op1 (nella dichiarazione di char op1, op2; è lasciato al compilatore decidere quale variabile allocare prima, se tu avesse dichiarato le variabili su righe separate il comportamento del tuo programma sarebbe stato diverso, ma sempre errato).
Quando acquisisci 12 in op1, ma lo fai come int, il compilatore inserisce in memoria nel primo byte il 12 stesso, e nel secondo uno 0, in quanto lo pensa un int e non un char. Quando nella istruzione successiva acquisisci il 13 per op3, ma ancora lo fai come int, il compilatore inserisce nel primo byte il 13 stesso e nel secondo byte (che nel tuo caso corrisponde all'indirizzo di op1) inserisce uno zero.

spero di essere stato chiaro

ciaos