【发布时间】:2014-11-17 07:40:57
【问题描述】:
我最近在使用 shift >> << 进行操作时注意到一个(奇怪的)行为!
为了解释它,让我编写这个可执行的小代码,它执行两个应该是相同的操作(在我的理解中),但我对不同的结果感到惊讶!
#include <stdio.h>
int main(void) {
unsigned char a=0x05, b=0x05;
// first operation
a = ((a<<7)>>7);
// second operation
b <<= 7;
b >>= 7;
printf("a=%X b=%X\n", a, b);
return 0;
}
运行时,a = 5 和 b = 1。我希望它们都等于1!有人能解释一下为什么我会得到这样的结果吗?
P.S:在我的环境中,unsigned char 的大小是 1 个字节
【问题讨论】:
-
所以
a = ((a<<31)>>31);会得到我想要的,对吧? (int 大小为 4 个字节) -
@JoachimPileborg:为什么在
a的情况下编译器不只是优化操作,而让a保持不变? -
@DavidC.Rankin 当然,没有什么可以阻止编译器这样做,唯一确定的方法是查看生成的汇编代码。但在一般的情况下,结果就是数字提升的结果。
-
a & 1将产生与您的第二次操作相同的结果(并且更有意义)。
标签: c bit-shift integer-promotion