c побитовый вопрос преобразования отрицания - PullRequest
3 голосов
/ 02 сентября 2010

следующий код:

signed char sc = ~0xFC;
unsigned char uc = ~0xFC;

при компиляции выдает мне следующие предупреждения:

integer conversion resulted in truncation
integer conversion resulted in truncation
  1. почему я получаю эти предупреждения
  2. какя пишу свой код, чтобы не получать эти предупреждения (без использования #pragmas)

thanx,

Я использую IAR Compiler для 8051,

вы получаете похожие предупреждения при компиляции с использованием других компиляторов?

Ответы [ 2 ]

6 голосов
/ 02 сентября 2010

Поскольку шестнадцатеричные литералы считаются целыми при написании, как вы это сделали 0xFC .., чтобы избежать предупреждения, просто приведите их к усечению числа до 1 байта:

~((char) 0xFC)

0xFC считается 0x000000FC в 32-битной архитектуре, поэтому, когда вы не примените, вы получите 0xFFFFFF03, это означает, что когда вы присваиваете этот результат символу, 3 наиболее значимых байта просто отбрасываются, и компилятор предупреждает вас об этом.

2 голосов
/ 02 сентября 2010

В С арифметика выполняется как минимум в размере 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;
...