В С арифметика выполняется как минимум в размере int
.Это означает, что ~0xFC
вернет int
.Более того, это значение равно 0xFF03
, что выходит за пределы диапазона char
(подписано или нет).
Следовательно, присвоение выдаст два предупреждения.Вы можете попробовать
signed char sc = ~0xFC & 0xFF;
, чтобы увидеть, знает ли компилятор, что результат находится в диапазоне char
(gcc не будет жаловаться после добавления & 0xFF
).Вы также можете попытаться добавить явное приведение:
signed char sc = (signed char)~0xFC;
// also possible:
// signed char sc = ~(signed char)0xFC;
или, поскольку значение может быть легко вычислено, почему бы не просто
signed char sc = 3;