Convertendo de char assinado para char não assinado e vice-versa?

Estou trabalhando com JNI e tenho uma matriz do tipo jbyte, onde jbyte é representado como um caractere assinado, ou seja, variando de -128 a 127. Os jbytes representam pixels da imagem. Para o processamento de imagens, geralmente queremos que os componentes de pixel variem de 0 a 255. Portanto, desejo converter o valor de jbyte no intervalo de 0 a 255 (ou seja, o mesmo intervalo que caractere não assinado), fazer alguns cálculos no valor e armazenar o resultado como um jbyte novamente.

Como posso fazer essas conversões com segurança?

Consegui fazer com que esse código funcionasse, onde um valor de pixel é aumentado em 30, mas fixado no valor 255, mas não entendo se é seguro ou portátil:

 #define CLAMP255(v) (v > 255 ? 255 : (v < 0 ? 0 : v))

 jbyte pixel = ...
 pixel = CLAMP_255((unsigned char)pixel + 30);

Estou interessado em saber como fazer isso em C e C ++.