char类型按位操作失败到int

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位.谁能帮我.

das*_*ght 7

你已经正确地找出了低位字节的内容,即0xfe.然而,在这里发生的事情还有更多:当你写作时

if (c == 0xfe) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

您比较c,一个char,一个int常数0xfe.在这种情况下Ç规则要求促进 char cint作比较.由于char在您的平台上签名,因此0xfe被提升0xfffffffe,这就是比较随后失败的原因.

如果你想在char类型中进行比较,请转换0xfechar,如下所示:

if (c == (char)0xfe) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

演示1.

另一方面,无符号字符会给你带来int促销的麻烦,因为它们很适合int:

unsigned char c = 127;
c<<=1;
if (c == 0xfe) { // No casting is necessary
    ...
}
Run Code Online (Sandbox Code Playgroud)

演示2.

注意:c <<= 1由于char溢出,实现定义的行为.

  • 注意`c << = 1;`中的行为是由于溢出而实现定义的. (2认同)