unsigned char String[9] = "S2KTI2G7";
unsigned char KeyTable[11] = "0123456789";
char *id = "0";
int i;

for(i = 0; i < 8; i++)
  String[i] ^= *id;

このプログラムの動作がよくわかりません
たとえばString[0]はSのアスキーコードが83、0のアスキーコードが48なので
String[0] = 83^48になるのかと思ったのですが、実際は99になっているようです。
どうして99になるのでしょうか?