c的模运算有负数

#include<stdio.h>

char encode(char a){

if(a>='a' && a<='z'){
    a=(a+1-'a'+26)%26+'A';
}
else if(a>='A' && a<='Z'){
    a=(a+1-'A'+26)%26+'a';
}
else if(a>='0' && a<='9'){
    a=(a+1-'0'+10)%10+'0';
}
return a;

}

char decode(char a){

if(a>='a' && a<='z'){
    int aa = a-1-'a';
    int bb = (a-1-'a')%26;
    a=(a-1-'a'+26)%26+'A';
}
else if(a>='A' && a<='Z'){
    a=(a-1-'A'+26)%26+'a';
}
else if(a>='0' && a<='9'){
    a=(a-1-'0'+10)%10+'0';
}
return a;

}

int main(){

char data[1000]={0};
char data2[1000]={0};
while(scanf("%s", data) != EOF){
    for(int i=0; data[i]!='\0'; i++){
    printf("%c", encode(data[i]));
    }
    printf("\n");
    scanf("%s", data2);
    for(int i=0; data2[i]!='\0'; i++){
    printf("%c", decode(data2[i]));
    }
    printf("\n");
}

}