最近我注意到了一个(奇怪的)行为,当我使用位移操作符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 字节) - chouaiba
的情况下编译器不会优化操作,使a
保持不变? - David C. Rankina & 1
将产生与您的第二个操作相同的结果(并且更有意义)。 - Sean Lathama = ((a<<31)>>31);
的结果是未定义的行为,因为整数提升将unsigned char
转换为int
,左移时的有符号溢出是未定义的行为。 - Virgile