El casting que haces destruye el int (16bits pasan a ser 8 bits):
15887 = 0x3E
0Fhaciendo el casting se truncan bits hasta quedar 8 bits (tamaño de unsigned char):
0x0F
Luego entonces... 0x0F % 0x04 = 0x03
pero por alguna razón no sale 0x03. Le di varias revisadas pero no encuentro el problema con el casting u otra cosa. ¿Qué valor queda en
result después de la operación?
Prueba con esta instrucción si lo anterior no ayuda...
result = (int) b % a;