13
volatile uint16_t r;
unsigned char poly = 0x07;
unsigned char c = 0;

r = (c << 8) ^ poly;

在 Linux 上使用 gcc 编译代码时,r7.
当 Microchip C18 编译相同的代码时,r0.
为什么?

如果我将其更改为:

volatile uint16_t r;
uint16_t poly = 0x07;
uint16_t c = 0;

r = (c << 8) ^ poly;

rC18也变成7了。

C18手册中有关于整数提升的部分,但我认为它与我的问题无关。无论如何,这里是:

ISO 要求以 int 或更高的精度执行所有算术运算。默认情况下,MPLAB C18 将以最大操作数的大小执行算术运算,即使两个操作数都小于 int。ISO 强制行为可以通过 -Oi 命令行选项设置。

4

2 回答 2

3

由于c << 8在此编译器中未定义,因此无法预测 xor 的结果。结果可以是编译器选择的任何内容。

有关未定义行为的介绍,请参阅每个 C 程序员应了解的未定义行为,尤其是“过大的移位量”部分。

于 2011-05-23T02:09:40.603 回答
2

c << 8 with ca char 基本上将所有位发送到遗忘。如文档中所述,c 和 8 都适合 char,因此一切都使用 char 完成。

c << 8UL 可能会改变交易。

于 2011-05-23T00:50:25.317 回答