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实现 命令行选项。
答案 0 :(得分:3)
由于此编译器中未定义c << 8
,因此无法预测xor的结果。结果可能是编译器选择的任何内容。
有关未定义行为的介绍,请参阅What Every C Programmer Should Know About Undefined Behavior,尤其是“超大转移金额”部分。
答案 1 :(得分:2)
c&lt;&lt; 8与c一个char基本上是将所有的位发送到遗忘。正如文档中指出的那样,c和8都适合char,所以一切都是使用char。
完成的c&lt;&lt; 8UL可能会改变交易。