char类型按位运算失败转int

char type bitwise operation fails in to int

我正在尝试在 C 中按位运算。这是我的代码:

int main() {
    char c = 127;
    c <<= 1;
    if (c == 0xfe) {
        printf("yes");
    }
    else {
        printf("No");
    }
    return 0;
}

系统控制台打印号 我期望收到的是 Yes。 位移动后c中的值是ffffffffe。 似乎系统已经将 8 位更改为 32 位。谁能帮帮我。

你已经正确计算出低字节的内容,即0xfe。然而,这里实际发生的事情还有很多:当你写

if (c == 0xfe) {
    ...
}

您正在将 ccharint 常量 0xfe 进行比较。在这种情况下,C 规则需要 promoting char cint 进行比较。由于 char 在您的平台上签名,0xfe 被提升为 0xfffffffe,这就是比较随后失败的原因。

如果要在 char 类型中进行比较,请将 0xfe 转换为 char,如下所示:

if (c == (char)0xfe) {
    ...
}

Demo 1.

另一方面,无符号字符不会给您带来 int 提升的麻烦,因为它们非常适合 int:

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

Demo 2.

注意: c <<= 1 的行为是 implementation-defined 由于 char 溢出。