C左移意外行为

时间:2018-01-18 03:28:29

标签: c microcontroller bit-shift sdcc

我有这段代码:

void GPIO_InitPortPin(uint8* PortControl, uint8 Pin, uint8 PinDir){
    *PortControl &= (~(1U << Pin));
    *PortControl |= (PinDir << Pin);
}

如果PortControl寄存器为11111111,则第一行应清除相应Pin的位,但意外地清除所有寄存器。

我的客户端功能是:GPIO_InitPortPin(&TRISB, GPIO_PIN_0, GPIO_IN);

GPIO_PIN_0GPIO_IN的宏定义如下:

#define GPIO_PIN_0    (0)
#define GPIO_PIN_1    (1)
...
#define GPIO_PIN_7    (7)

#define GPIO_OUT      (0)
#define GPIO_IN       (1)

所以,我尝试将Pin转换为sint8*PortControl &= (~(1U << (sint8) Pin));

它有效。此外,我尝试将Pin硬编码为1,它运行正常。我知道问题是Pinuint8或具体是unsigned,因为

*PortControl &= (~(1U << 1)); 也工作得很好。 我的问题是:为什么右操作数类型会影响换档操作,虽然之前我已经红了(RHS不会影响操作)?

我使用SDCC编译器。

编辑:我已经测试了该函数而没有在gcc上进行投射,并且它按预期工作。

0 个答案:

没有答案