Микрочип XC8 предупреждает "преобразование в более короткий тип данных" и "неявное преобразование, подписанное в неподписанное"

Я использую MPLABX 3.20 с компилятором xc8 1.35 для PIC18F2420, и у меня есть два странных предупреждения, которые я не понимаю:

Вот один из исходных кодов, которые генерируют предупреждение

9  void write(Pin _Pin, char value)
10  {
11     if( value == 1)
12     {
13         (*((_Pin.Reg)+ 5*sizeof(char))) |=(1<<_Pin.Bit);
14     }
15     else
16     {
17         (*((_Pin.Reg)+ 5*sizeof(char))) &= ~(1<<_Pin.Bit);
18     }
19 }

Вот строительный штифт, который я использую:

typedef unsigned char *SFR;

typedef struct 
{
    SFR Reg;
    unsigned char Bit;
    SFR ReadReg;

}Pin;

этот код используется, чтобы предложить простой способ использовать контакты

У меня есть следующие предупреждения:

Pin.c: 13: предупреждение: (373) неявное преобразование подписанного в неподписанное

Pin.c:17: предупреждение: (373) неявное преобразование подписанного в неподписанное

...

Pin.c:17: предупреждение: (752) преобразование в более короткий тип данных

оба значения являются беззнаковыми символами, так почему у меня есть эти предупреждения?

1 ответ

оба значения являются беззнаковыми символами, так почему у меня есть эти предупреждения?

Полезным подходом для себя будет: предположите, что вы не правы. Где ты можешь ошибаться? Очевидно, что поскольку у вас есть предупреждения, значения не могут быть подписаны.

Теперь давайте проанализируем, как они не могут быть без знака. _Pin.Bit это значение без знака. Но мы не используем это. Мы используем его в целочисленном выражении, тип которого - ну - просто int:

Выражение (1<<_Pin.Bit) имеет тип int,

Выражение ~(1<<_Pin.Bit) имеет тип int и, кроме того, вы отбрасываете его биты, отличные от нуля, при преобразовании в беззнаковый символ, вызывая второе предупреждение для строки 17.

Другие вопросы по тегам