Микрочип 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.