Creo que me colé en un pequeño detalle.
Si bien acarreo terminará valiendo 1 tras las 10 iteraciones cuando el resultado de la resta sea negativo,también hay combinaciones que den resultados positivos que harán que acarreo también termine con el valor 1.Un ejemplo ilustrativo sería el mismo de antes pero cambiando el orden de los operandos:
140 - 138 = 8
A partir del 4º dígito en adelante,todos son ceros,por lo que acarreo termina con el valor 1.
Se me ocurre que en vez de usar el valor final de acarreo para actuar de una forma u otra lo hagas con una variable booleana.Algo así:
int i,Acarreo,BCD[10],RES[10];
boolean bcd_mayor = TRUE;
Acarreo=0;
for(i=0;i<10;i++){
if(BCD[i]<=RES[i]){
if(BCD[i] < RES[i]) { bcd_mayor = FALSE; }
BCD[i]=(BCD[i]+10)-(RES[i]+Acarreo);
Acarreo=1;}
else{
bcd_mayor = TRUE;
BCD[i]=BCD[i]-(RES[i]+Acarreo);
Acarreo=0;}
Asi,desde el primer dígito hasta el último y en cada iteración,la booleana te estará indicando quien es mayor de los dos.
Cuando los dígitos sean iguales,dicha variable mantendrá su valor anterior,siendo los dos dígitos que la sobreescriban por última vez los que determinarán cual de los dos números es mayor.