我使用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 }
这是我使用的Struct Pin:
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)转换为较短的数据类型
两个值都是unsigned char,为什么我有这些警告?
答案 0 :(得分:1)
两个值都是unsigned char,为什么我有这些警告?
对自己有用的方法是:假设你错了。你哪里错了?显然,因为你有警告,所以这些值不能是无符号的。
现在让我们分析一下他们可能没有签名。 _Pin.Bit
是无符号值。但是我们不使用它。我们在整数表达式中使用它,其类型是 - 简单地int
:
表达式(1<<_Pin.Bit)
的类型为int
。
表达式~(1<<_Pin.Bit)
的类型为int
,而且当转换为unsigned char时,您将丢弃其非零符号位,从而提示第17行的第二个警告。