2

我正在为 PIC18F2420 使用带有 xc8 1.35 编译器的 MPLABX 3.20,我有两个我不明白的奇怪警告:

这是生成警告的源代码之一

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)转换为更短的数据类型

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

4

1 回答 1

1

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

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

现在让我们分析一下它们是如何不被签名的。_Pin.Bit是一个无符号值。但我们不使用它。我们在一个整数表达式中使用它,它的类型是 - 好吧 - 简单int

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

该表达式~(1<<_Pin.Bit)是类型的int,此外,在转换为无符号字符时,您将丢弃其非零符号位,从而提示第 17 行的第二个警告。

于 2016-04-20T16:54:34.780 回答