【发布时间】:2014-01-31 06:24:51
【问题描述】:
我在用 C 语言为 8 位 AVR 微控制器编程时遇到了意外行为: 考虑以下几点:
unsigned char a = 0xFF, b = 0xFF;
unsigned short c = ((a>>4)<<8)+b;
printf("%x",c);
其中字节a 的高位半字节包含位8..11,字节b 包含12 位值c 的位7..0。代码的意图最初是删除不需要的字节a 的低半字节,然后组合a 和b 以产生c 的值。但是后来我意识到代码不应该工作,因为a 是一个 8 位值,并且将其向左移动 8 位应该导致将字节清除为 0,最终结果为 0x00FF。相反,代码会产生 0x0FFF 的结果,正如最初预期的那样。该代码在微控制器 (avr-gcc) 和 PC (gcc) 上产生相同的结果。这种行为的原因是什么?
【问题讨论】:
-
>>的操作数根据标准 C 规则进行扩展(我现在忘记了)。但基本上a扩展为int。
标签: c++ c bit-manipulation