キャストとは、「明示的に型を指定して型変換を行う」こと
#include <stdio.h>
int main(){
signed char c;
unsigned char uc;
signed char *pc = NULL;
unsigned char *puc = NULL;
c = -1;
uc = (unsigned char)c;
printf("%d %d\n", c, uc); // -1 255
c = (signed char)uc;
printf("%d %d\n", c, uc); // -1 255
// キャストして代入してもビット列は変わらない
// 最上位ビットを符号として扱うかどうか
pc = &c;
puc = (unsigned char*)pc;
// アドレスの代入だが、ポインタ変数の型が異なるので、
// キャスト(明示的な型変換)しないとWarningで怒られる
printf("%d %d\n", *pc, *puc); // -1 255
// ポインタでも同じ
printf("%d %d\n", (unsigned char)*pc, (char)*puc); // 255 -1
// ポインタ変数が指している値のキャスト
printf("%d %d\n", *(unsigned char*)pc, *(char*)puc); // 255 -1
// ポインタ変数のキャスト
return 0;
}