Akr*_*ios 4 c bit-manipulation type-conversion integer-promotion type-promotion
我尝试在C中按位操作.这是我的代码:
int main() {
char c = 127;
c <<= 1;
if (c == 0xfe) {
printf("yes");
}
else {
printf("No");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
系统控制台打印否.我希望收到的是是.位移后c中的值为ffffffffe.似乎系统已经将8位改为32位.谁能帮我.
你已经正确地找出了低位字节的内容,即0xfe.然而,在这里发生的事情还有更多:当你写作时
if (c == 0xfe) {
...
}
Run Code Online (Sandbox Code Playgroud)
您比较c,一个char,一个int常数0xfe.在这种情况下Ç规则要求促进 char c以int作比较.由于char在您的平台上签名,因此0xfe被提升0xfffffffe,这就是比较随后失败的原因.
如果你想在char类型中进行比较,请转换0xfe为char,如下所示:
if (c == (char)0xfe) {
...
}
Run Code Online (Sandbox Code Playgroud)
另一方面,无符号字符会给你带来int促销的麻烦,因为它们很适合int:
unsigned char c = 127;
c<<=1;
if (c == 0xfe) { // No casting is necessary
...
}
Run Code Online (Sandbox Code Playgroud)
注意:c <<= 1由于char溢出,实现定义的行为.