volatile uint16_t r;
unsigned char poly = 0x07;
unsigned char c = 0;
r = (c << 8) ^ poly;
在 Linux 上使用 gcc 编译代码时,r
是7
.
当 Microchip C18 编译相同的代码时,r
是0
.
为什么?
如果我将其更改为:
volatile uint16_t r;
uint16_t poly = 0x07;
uint16_t c = 0;
r = (c << 8) ^ poly;
r
C18也变成7
了。
C18手册中有关于整数提升的部分,但我认为它与我的问题无关。无论如何,这里是:
ISO 要求以 int 或更高的精度执行所有算术运算。默认情况下,MPLAB C18 将以最大操作数的大小执行算术运算,即使两个操作数都小于 int。ISO 强制行为可以通过 -Oi 命令行选项设置。