Кстати, если сделать приведение к unsigned Можно и без масок обойтись:
int r = -1;
printf("rc = 0x%08X, rs = 0x%08X, ri = 0x%08X\n",
(unsigned char)r, (unsigned short)r, (unsigned int)r);
Результат:
rc = 0x000000FF, rs = 0x0000FFFF, ri = 0xFFFFFFFF
Компилил VC 6.0 и OWC 1.2