为什么uint16_t在这里有所作为?

时间:2011-05-23 00:02:24

标签: c integer microcontroller pic

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;

r也在C18中成为7

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

  

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

2 个答案:

答案 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可能会改变交易。