C no operador ¿por qué recibo una advertencia

¿Qué hay de malo con este código?

typedef unsigned char datum; /* Set the data bus width to 8 bits. */ datum pattern; datum antipattern; antipattern = ~pattern; Remark[Pa091]: operator operates on value promoted to int (with possibly unexpected result) C:\filepath...\file.c 386 

El comstackdor es IAR EWARM, por lo que las dos variables char deben convertirse en un int. ¿Por qué debería quejarse de un cambio de signo cuando todo se declara como no firmado?

¿Alguna idea de qué modelo usar para deshacerse de esta advertencia?

Las reglas de C requieren que los operandos de caracteres unsigned char se conviertan a int (excepto en implementaciones perversas de C).

Una vez que el operando es un int , se firma, y ​​el operador ~ puede darle resultados inesperados, ya que la semántica para enteros con signo y sus representaciones de bits no están completamente especificadas por C. El comstackdor le advierte amablemente sobre esto.

Debe usar el antipattern = ~ (unsigned int) pattern; . Con unsigned int , se garantiza que el valor se representa con un binario simple.