Microchip XC8警告"转换为更短的数据类型"和#34;隐式转换签名为unsigned"

时间:2016-04-20 16:45:22

标签: c microchip 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 }

这是我使用的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,为什么我有这些警告?

1 个答案:

答案 0 :(得分:1)

  

两个值都是unsigned char,为什么我有这些警告?

对自己有用的方法是:假设你错了。你哪里错了?显然,因为你有警告,所以这些值不能是无符号的。

现在让我们分析一下他们可能没有签名。 _Pin.Bit是无符号值。但是我们不使用它。我们在整数表达式中使用它,其类型是 - 简单地int

表达式(1<<_Pin.Bit)的类型为int

表达式~(1<<_Pin.Bit)的类型为int,而且当转换为unsigned char时,您将丢弃其非零符号位,从而提示第17行的第二个警告。